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

举报
lxw1844912514 发表于 2022/03/27 00:02:11 2022/03/27
【摘要】 Laravel/Lumen的日志简单系统介绍: Laravel/Lumen的日志默认是基于Monolog进行了一层封装,如果要求不高,用起来还是十分容易的,本文基于laravel5.6/Lumen5.6版本进行解说。5.6版对日志系统做了升级,将日志的配置单独放以了config/logging.php 配置文件中,所以现在实用多了。 ...

Laravel/Lumen的日志简单系统介绍:

Laravel/Lumen的日志默认是基于Monolog进行了一层封装,如果要求不高,用起来还是十分容易的,本文基于laravel5.6/Lumen5.6版本进行解说。5.6版对日志系统做了升级,将日志的配置单独放以了config/logging.php 配置文件中,所以现在实用多了。


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

开始使用Laravel5.5时经常遇到有人问Laravel中日志的为什么只有一个文件,能不能修改日志目录,能不能修改日志文件名?刚开始用时我也有这样的困惑,由于早期项目简单(其实是懒),没有去深入研究。后来跟到了5.6,官方终于发飙了,完美通过配置解决问题(5.5的版本其实也有解决方案,可以自行搜索一下,顺便吐槽一下Lavavel官方文档太简单了,感觉一大半的强大功能都没有提及如何深度使用)。以下代理示例,大概的备注了一下参数说明,还有一些可以挖掘。

 


  
  1. <?php
  2. // 配置文件路径:/config/logging.php
  3. return [
  4. // 默认用哪个
  5. 'default' => env('LOG_CHANNEL', 'stack'),
  6. 'channels' => [
  7. //自定义频道
  8. 'myapplog' => [
  9. // 日志驱动模式:
  10. 'driver' => 'daily',
  11. // 日志存放路径
  12. 'path' => storage_path('logs/myapplog.log'),
  13. // 日志等级:
  14. 'level' => 'info',
  15. // 日志分片周期,多少天一个文件
  16. 'days' => 1,
  17. ],
  18. // 系统默认,可以合并几个频道,按等级对应记录,符合等级条件的都记录
  19. 'stack' => [
  20. 'driver' => 'stack',
  21. 'channels' => ['single','daily'],
  22. ],
  23. 'single' => [
  24. 'driver' => 'single',
  25. 'path' => storage_path('logs/laravel.log'),
  26. 'level' => 'debug',
  27. ],
  28. 'daily' => [
  29. 'driver' => 'daily',
  30. 'path' => storage_path('logs/laravel.log'),
  31. 'level' => 'info',
  32. 'days' => 7,
  33. ],
  34. ],
  35. ];

日志使用:

 


  
  1. <?php
  2. use Log;
  3. class LogTestController extends Controller
  4. {
  5. $message = 'Some message';
  6. $log = ['user_id'=>1,'user_name'=>'abcd'];
  7. 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项:

 


  
  1. return [
  2. 'default' => env('LOG_CHANNEL', 'myapplog'),
  3. 'channels' => [
  4. 'myapplog' => [
  5. 'driver' => 'daily',
  6. 'path' => storage_path('logs/myapplog.log'),
  7. // 挂载日志格式接口(重点)
  8. 'tap' => [App\Logging\ApplogFormatter::class],
  9. 'level' => 'info',
  10. 'days' => 1,
  11. ],
  12. ],
  13. ];

新建App/Logging/ApplogFormatter.php

 


  
  1. <?php
  2. namespace App\Logging;
  3. use App\Logging\JsonFormatter;
  4. class ApplogFormatter
  5. {
  6. /**
  7. * Customize the given logger instance.
  8. *
  9. * @param \Illuminate\Log\Logger $logger
  10. * @return void
  11. */
  12. public function __invoke($logger)
  13. {
  14. foreach ($logger->getHandlers() as $handler) {
  15. $handler->setFormatter(new JsonFormatter());
  16. }
  17. }
  18. }

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

 


  
  1. <?php
  2. namespace App\Logging;
  3. use Monolog\Formatter\JsonFormatter as BaseJsonFormatter;
  4. class JsonFormatter extends BaseJsonFormatter
  5. {
  6. public function format(array $record)
  7. {
  8. // 这个就是最终要记录的数组,最后转成Json并记录进日志
  9. $newRecord = [
  10. 'time' => $record['datetime']->format('Y-m-d H:i:s'),
  11. 'message' => $record['message'],
  12. ];
  13. if (!empty($record['context'])) {
  14. $newRecord = array_merge($newRecord, $record['context']);
  15. }
  16. //$json = 'aaa,bbb,ccc'; // 这是最终返回的记录串,可以按自己的需求改
  17. $json = $this->toJson($this->normalize($newRecord), true) . ($this->appendNewline ? "\n" : '');
  18. return $json;
  19. }
  20. }

Log的记录方法还是一样用:

 


  
  1. class LogTestController extends Controller
  2. {
  3. $message = 'Some message';
  4. $log = ['user_id'=>1,'user_name'=>'abcd'];
  5. Log::channel('myapplog')->info($message, $log); //Log后的数组会自动转成Json存

看看最终的效果:

 

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

 

大功告成!

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/105703097

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。