laravel 5.6日志理解及日志格式定義

Laravel/Lumen的日志簡(jiǎn)單系統(tǒng)介紹:

Laravel/Lumen的日志默認(rèn)是基于Monolog進(jìn)行了一層封裝,如果要求不高,用起來(lái)還是十分容易的,本文基于laravel5.6/Lumen5.6版本進(jìn)行解說(shuō)。5.6版對(duì)日志系統(tǒng)做了升級(jí),將日志的配置單獨(dú)放以了config/logging.php 配置文件中,所以現(xiàn)在實(shí)用多了。


基本配置(解決日志路徑文件名和保存周期等)

開(kāi)始使用Laravel5.5時(shí)經(jīng)常遇到有人問(wèn)Laravel中日志的為什么只有一個(gè)文件,能不能修改日志目錄,能不能修改日志文件名?剛開(kāi)始用時(shí)我也有這樣的困惑,由于早期項(xiàng)目簡(jiǎn)單(其實(shí)是懶),沒(méi)有去深入研究。后來(lái)跟到了5.6,官方終于發(fā)飆了,完美通過(guò)配置解決問(wèn)題(5.5的版本其實(shí)也有解決方案,可以自行搜索一下,順便吐槽一下Lavavel官方文檔太簡(jiǎn)單了,感覺(jué)一大半的強(qiáng)大功能都沒(méi)有提及如何深度使用)。以下代理示例,大概的備注了一下參數(shù)說(shuō)明,還有一些可以挖掘。

<?php
// 配置文件路徑:/config/logging.php
return [
    // 默認(rèn)用哪個(gè)
    'default' => env('LOG_CHANNEL', 'stack'),

    'channels' => [
        //自定義頻道
        'myapplog' => [
            // 日志驅(qū)動(dòng)模式:
            'driver' => 'daily',                            
            // 日志存放路徑
            'path' => storage_path('logs/myapplog.log'),
            // 日志等級(jí):
            'level' => 'info',
            // 日志分片周期,多少天一個(gè)文件
            'days' => 1,
        ],

        // 系統(tǒng)默認(rèn),可以合并幾個(gè)頻道,按等級(jí)對(duì)應(yīng)記錄,符合等級(jí)條件的都記錄
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single','daily'],
        ],
        'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
        ],
        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'info',
            'days' => 7,
        ],
    ],
];

日志使用:

<?php
use Log;

class LogTestController extends Controller
{
  $message = 'Some message';
  $log = ['user_id'=>1,'user_name'=>'abcd']; 
  Log::channel('myapplog')->info($message, $log);  //Log后的數(shù)組會(huì)自動(dòng)轉(zhuǎn)成Json存到日志記錄中

查看記錄到的效果:

[2018-02-23 10:22:28] local.INFO: Some message {'user_id':1,'user_name':'abcd'}

高階定制:(完全定義日志格式,本例為全Json格式)

踩了好多坑,開(kāi)始嘗試直接自己 new 一個(gè) monolog 的方案,雖然也實(shí)現(xiàn)了全 Json 記錄了,但有很多不想要的字段。達(dá)不到要求。
幾經(jīng)折騰,發(fā)現(xiàn) Monolog 有很多可以用的 Formatter ,但發(fā)現(xiàn)官方的把字段寫(xiě)死在里邊了,抓狂到了想直接改官方源碼的齷齪地步了,還是不死心,最終發(fā)現(xiàn)Laravel5.6的logging參數(shù)中有一個(gè)tap的接口可以用。順著這條線,最終通過(guò)重定義 Formatter 的 format() 方法實(shí)現(xiàn)了需求 :
1、配置logging.php中的 tap項(xiàng):

return [
    'default' => env('LOG_CHANNEL', 'myapplog'),
    'channels' => [
        'myapplog' => [
            'driver' => 'daily',                            
            'path' => storage_path('logs/myapplog.log'),
            // 掛載日志格式接口(重點(diǎn))
            'tap' => [App\Logging\ApplogFormatter::class],
            'level' => 'info',
            'days' => 1,
        ],
    ],
];

新建App/Logging/ApplogFormatter.php

<?php
namespace App\Logging;

use App\Logging\JsonFormatter;

class ApplogFormatter
{
    /**
     * Customize the given logger instance.
     *
     * @param  \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $handler->setFormatter(new JsonFormatter());
        }
    }
}

重點(diǎn):新建/App/Logging/JsonFormatter.php

<?php
namespace App\Logging;

use Monolog\Formatter\JsonFormatter as BaseJsonFormatter;

class JsonFormatter extends BaseJsonFormatter
{
    public function format(array $record)
    {
        // 這個(gè)就是最終要記錄的數(shù)組,最后轉(zhuǎn)成Json并記錄進(jìn)日志
        $newRecord = [
            'time' => $record['datetime']->format('Y-m-d H:i:s'),
            'message' => $record['message'],
        ];

        if (!empty($record['context'])) {
            $newRecord = array_merge($newRecord, $record['context']);
        }
        //$json = 'aaa,bbb,ccc';  // 這是最終返回的記錄串,可以按自己的需求改
        $json = $this->toJson($this->normalize($newRecord), true) . ($this->appendNewline ? "\n" : '');

        return $json;
    }
}

Log的記錄方法還是一樣用:

class LogTestController extends Controller
{
  $message = 'Some message';
  $log = ['user_id'=>1,'user_name'=>'abcd']; 
  Log::channel('myapplog')->info($message, $log);  //Log后的數(shù)組會(huì)自動(dòng)轉(zhuǎn)成Json存

看看最終的效果:

{"time":"2018-06-09 13:39:39","message":"Some message","user_id":1,"user_name":"abcd"}

大功告成!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,559評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,442評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,835評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,581評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,922評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,096評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,639評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,374評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,591評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,789評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,196評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,524評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,322評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,554評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容