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

      網友投稿 1058 2025-03-31

      Laravel/Lumen的日志簡單系統介紹:

      Laravel/Lumen的日志默認是基于Monolog進行了一層封裝,如果要求不高,用起來還是十分容易的,本文基于laravel5.6/Lumen5.6版本進行解說。5.6版對日志系統做了升級,將日志的配置單獨放以了config/logging.php 配置文件中,所以現在實用多了。

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

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

      // 配置文件路徑:/config/logging.php

      return [

      // 默認用哪個

      'default' => env('LOG_CHANNEL', 'stack'),

      'channels' => [

      //自定義頻道

      'myapplog' => [

      // 日志驅動模式:

      'driver' => 'daily',

      // 日志存放路徑

      'path' => storage_path('logs/myapplog.log'),

      // 日志等級:

      'level' => 'info',

      // 日志分片周期,多少天一個文件

      'days' => 1,

      ],

      // 系統默認,可以合并幾個頻道,按等級對應記錄,符合等級條件的都記錄

      '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,

      ],

      ],

      ];

      日志使用:

      use Log;

      class LogTestController extends Controller

      {

      $message = 'Some message';

      $log = ['user_id'=>1,'user_name'=>'abcd'];

      Log::channel('myapplog')->info($message, $log); //Log后的數組會自動轉成Json存到日志記錄中

      查看記錄到的效果:

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

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

      踩了好多坑,開始嘗試直接自己 new 一個 monolog 的方案,雖然也實現了全 Json 記錄了,但有很多不想要的字段。達不到要求。

      幾經折騰,發現 Monolog 有很多可以用的 Formatter ,但發現官方的把字段寫死在里邊了,抓狂到了想直接改官方源碼的齷齪地步了,還是不死心,最終發現Laravel5.6的logging參數中有一個tap的接口可以用。順著這條線,最終通過重定義 Formatter 的 format() 方法實現了需求 :

      1、配置logging.php中的 tap項:

      return [

      'default' => env('LOG_CHANNEL', 'myapplog'),

      'channels' => [

      'myapplog' => [

      'driver' => 'daily',

      'path' => storage_path('logs/myapplog.log'),

      // 掛載日志格式接口(重點)

      'tap' => [App\Logging\ApplogFormatter::class],

      'level' => 'info',

      'days' => 1,

      ],

      ],

      ];

      新建App/Logging/ApplogFormatter.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());

      }

      }

      }

      重點:新建/App/Logging/JsonFormatter.php

      namespace App\Logging;

      use Monolog\Formatter\JsonFormatter as BaseJsonFormatter;

      class JsonFormatter extends BaseJsonFormatter

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

      {

      public function format(array $record)

      {

      // 這個就是最終要記錄的數組,最后轉成Json并記錄進日志

      $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后的數組會自動轉成Json存

      看看最終的效果:

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

      大功告成!

      JSON Laravel

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:怎樣在WPS演示中插入背景音樂
      下一篇:表格怎么劃線?(手機wps表格怎么劃線)
      相關文章
      亚洲欧洲日产国码av系列天堂| 亚洲A丁香五香天堂网| 亚洲免费观看视频| 亚洲免费一区二区| 亚洲伦乱亚洲h视频| 久久伊人亚洲AV无码网站| 亚洲视频在线精品| 亚洲精品国产福利一二区| 亚洲男女内射在线播放| 国产亚洲午夜高清国产拍精品| 久久精品亚洲福利| 亚洲伊人久久精品影院| 亚洲色欲久久久综合网东京热| 亚洲国产日韩在线视频| 久久亚洲精品AB无码播放| 亚洲精品国产成人99久久| 亚洲一区二区三区电影| 亚洲精品国产成人| 亚洲一卡2卡4卡5卡6卡残暴在线| 亚洲最大的黄色网| 亚洲日韩中文字幕无码一区| 亚洲AV永久无码精品网站在线观看| 爱爱帝国亚洲一区二区三区| 国产成人亚洲精品91专区高清| 亚洲精品国产高清不卡在线| 国产亚洲精品AA片在线观看不加载 | 亚洲成AV人网址| 亚洲日韩精品无码专区网站| 中文字幕中韩乱码亚洲大片| 亚洲国产精品无码AAA片| 亚洲欧洲在线观看| 亚洲一级在线观看| 亚洲成aⅴ人片久青草影院按摩| 国产亚洲女在线线精品| 久久久精品国产亚洲成人满18免费网站 | 亚洲永久无码3D动漫一区| 国产aⅴ无码专区亚洲av| 亚洲视频在线一区二区三区| 久久亚洲国产成人影院| 国产精品亚洲综合| 亚洲人成伊人成综合网久久久 |