laravel 5.6日志理解及日志格式定义「建议收藏」

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

大家好,又见面了,我是全栈君。

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

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


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

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

 

<?php
// 配置文件路径:/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,
        ],
    ],
];

日志使用:

 

<?php
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

 

<?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

 

<?php
namespace App\Logging;

use Monolog\Formatter\JsonFormatter as BaseJsonFormatter;

class JsonFormatter extends BaseJsonFormatter
{
    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"}

大功告成!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111805.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Web安全之SSRF漏洞

    Web安全之SSRF漏洞内容SSRF漏洞的危害SSRF漏洞的挖掘SSRF漏洞的防御SSRF漏洞原理概述背景SSRF(Server-SideRequestForgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。概述很多Web应用都提供了从其他服务器上获取数据的功能。使用用户指定的URL,Web应用可以获取图片…

    2022年6月25日
    24
  • java中calendar类打印日历_输入年份和月份求天数

    java中calendar类打印日历_输入年份和月份求天数题目题目另可表述为:1.输入一个年份和月份,按格式输出此月份的日历2.以如下格式输出一个月份的日历代码实现1.Calendar类的一些说明Calendar类是一个抽象类,不能通过new的方式来获得实例,可以使用类方法getInstance()返回一个Calendar的子类对象.Calendarcalendar=Calendar.getInstance();…

    2022年9月2日
    9
  • 安卓手机修改ntp服务器,修改安卓手机ntp服务器地址「建议收藏」

    安卓手机修改ntp服务器,修改安卓手机ntp服务器地址「建议收藏」修改安卓手机ntp服务器地址内容精选换一换TTL(Time-To-Live)指解析记录在本地DNS服务器中的缓存时间。本地DNS服务器指用户客户端(手机、电脑等)连接Internet网络使用的DNS,默认使用的DNS是宽带运营商自动分配的DNS服务器,用户也可以将该DNS修改为公共DNS服务器,例如,114.114.114.114、8.8.8.8。通过华为云购买的弹性云服务器默认硬件要求如表1所…

    2022年6月9日
    249
  • css left right_leftorright什么意思

    css left right_leftorright什么意思零、说点什么好久没更新了。并不是在折腾什么大作,而是广度学习与实践中,加上婚礼等诸多大事,所以产出较少。今天这篇也只是小作,博客是自己很好的学习工具,只要我学习不止,博客也会不断更新的。我们平时一般都使用clear:both清除浮动,貌似就干这一件事件。用得很开心,但似乎理解上懵懵懂懂,我其实也是,早年的时候,测试过CSS clear:left/right,虽知其作用(

    2022年9月11日
    1
  • nevicat15激活码_通用破解码[通俗易懂]

    nevicat15激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    28
  • Windows端口被占用_windows如何打开端口

    Windows端口被占用_windows如何打开端口电脑系统为Windows10一以管理员身份打开命令行窗口【Win+R】:使用快捷键打开“运行”窗口输入【cmd】,点击确定,打开“命令”窗口二查看被占用端口对应的PID比如在开发时,系统提示你1080已被占用,我们首先要做的就是找到1080端口对应的PID。在命令行中输入命令:netstat-aon|findstr”1080″回车执行命令后,最后一位数字就是被占用窗口的PID。我这里对应的是16996和18912。三查看指定PID的进程在命令行中输入命令:ta.

    2022年9月6日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号