• 技术文章 >php框架 >ThinkPHP

    ThinkPHP6.0版本的日志变化

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-12-16 13:41:50转载3994

    6.0的日志类比之前版本完善了很多,主要新特性包括:

    ·日志信息格式化

    ·多通道写入支持

    ·延时/实时写入

    ·日志信息处理事件

    ·日志级别指定通道写入

    ·支持关闭日志/通道

    新版的日志类最大的变化就是支持多通道写入,也就是说你可以同时或者给部分日志类型增加另外的日志通道写入,例如对于一些异常日志可以选择发送错误到邮件通知。

    其它的变化主要包括:

    ·WEB日志和CLI日志合并并统一格式;

    ·默认不再记录访问信息,需要可以自己记录;

    ·独立日志也支持JSON格式记录;

    日志的相关配置可以在config/log.php文件中设置,本篇主要描述下新版日志的变化。

    日志通道

    日志通道的概念相当于给日志信息做了一个日志空间,每个日志通道的日志信息采用独立的写入机制或者配置参数,你可以给日志信息指定默认的日志通道,也可以动态切换通道写入,并且支持同一个日志信息同时写入多个日志通道。

    你可以在日志配置文件的channels配置中定义通道,默认仅定义了一个file通道。

    // 日志通道列表
    'channels'     => [
        'file' => [
            // 日志记录方式
            'type'           => 'File',
            // 日志保存目录
            'path'           => '',
            // 单文件日志写入
            'single'         => false,
            // 独立日志级别
            'apart_level'    => [],
            // 最大日志文件数量
            'max_files'      => 0,
            // 使用JSON格式记录
            'json'           => false,
            // 日志输出格式化
            'format'         => '[%s][%s] %s',
            // 是否实时写入
            'realtime_write' => false,
        ],
        // 其它日志通道配置
    ],

    每个日志通道必须指定type参数,该参数决定了日志的写入方式是什么,file就表示文件日志方式写入,如果需要指定其它的写入方式需要安装额外的扩展。但你也可以给不同的日志通道指定相同的type,只是其它的配置参数不同,例如写入的路径不同之类。

    无论使用什么日志写入类型,每个日志通道可以支持的通用配置如下:

    1576474151410342.png

    level参数的用法和全局日志配置一致,除了在命令行模式下,默认的日志都是在请求结束后统一一次性写入,如果需要实时写入日志信息需要设置。

    'realtime_write'=>true,

    如果在命令行下,无论是否设置都会自动实时写入日志。

    默认通道

    通过设置default参数定义日志的默认通道,例如:

    'default'=>'file',

    级别通道

    可以设置不同的日志级别使用不同的日志通道。

    'type_channel'=>[
    // 对于error日志级别 同时写入file和email两个日志通道
    'error'=>['file','email'],
    ]

    设置了级别通道后,该级别的日志不会记录到默认通道,请注意。

    日志通道需要日志驱动的配合,你也可以自定义日志驱动。

    切换通道

    你也可以手动切换当前的日志的默认写入通道,例如:

    Log::channel('email')->info('这是日志信息');

    支持切换使用多个通道记录,例如:

    Log::channel(['email', 'file'])->info('这是日志信息');

    日志处理

    日志写入支持事件监听,例如:

    Event::listen('think\event\LogWrite', function($event) {
        if('file' == $event->channel) {
            $event->log['info'][] = 'test info';
        }
    });

    闭包的参数是LogWrite事件类对象实例,你可以获取两个属性:

    1576473997540347.png

    日志信息是一个二维数组,包含了当前日志通道下(允许记录的)所有级别的日志信息。

    格式化日志信息

    系统提供了两个参数用于日志信息的格式化,第一个是用于自定义时间显示格式的time_format,第二个是调整日志输出格式的format参数。

    'channels'    =>    [
        'file'    =>    [
            'type'          => 'file', 
            'json'        =>true
            'file_size'   => 1024*1024*10,    
            'time_format'   =>    'Y-m-d H:i:s',
            'format'        =>    '[%s][%s]:%s',
        ],
    ],

    format参数的第一个%s是日志记录时间(日志时间的格式化由time_format参数定义) 第二个%s是日志级别 第三个%s是日志信息,顺序不能调整。

    JSON格式日志

    可以支持JSON格式记录文件日志,更加方便一些第三方日志分析工具进行日志分析。

    在日志配置文件中,添加

    return [
        'default'      => 'file',
        'channels'    =>    [
            'file'    =>    [
                'type'          => 'file', 
                'json'        =>true
                'file_size'   => 1024*1024*10,    
            ],
        ],
    ];

    即可开启JSON格式记录,CLI命令行的日志记录同样有效。

    和之前版本的区别在于,新版的每个日志信息都是一条JSON数据(旧版本是每个请求一条JSON数据)。

    关闭日志

    你可以通过调用close方法动态关闭日志写入。

    // 关闭全局日志写入
    Log::close();
    // 关闭某个通道日志写入
    Log::close('file');

    如果调用close方法动态关闭日志,会自动调用clear方法清空日志。

    清空日志

    一旦执行save方法后,内存中的日志信息就会被自动清空,如果需要提前清空日志可以使用:

    // 清空所有日志
    Log::clear();
    //清空通道日志可以使用
    Log::clear('file');

    在清空日志方法之前,你可以使用getLog方法获取内存中的日志。

    // 获取(默认通道)日志
    $logs = Log::getLog();
    // 获取指定通道日志
    $logs = Log::getLog('file');

    日志清空仅仅是清空内存中的日志。

    自定义驱动

    日志通道需要自定义日志驱动,该日志驱动需要实现think\contract\LogHandlerInterface接口。

    interface LogHandlerInterface
    {
        /**
         * 日志写入接口
         * @access public
         * @param  array $log 日志信息
         * @return bool
         */
        public function save(array $log): bool;
    }

    众多ThinkPHP教程,尽在PHP中文网,欢迎在线学习!

    本文转自:https://blog.thinkphp.cn/1186947

    以上就是ThinkPHP6.0版本的日志变化的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:ThinkPHP官网,如有侵犯,请联系admin@php.cn删除
    专题推荐:ThinkPHP6.0 日志 变化
    上一篇:一文了解ThinkPHP6.0之中间件 下一篇:ThinkPHP5.2:时间查询(改进、优化)
    大前端线上培训班

    相关文章推荐

    • ThinkPHP6.0版本正式发布,全面拥抱组件化开发趋势• ThinkPHP6.0RC2版本发布——架构升级、精简核心• ThinkPHP6.0管道模式与中间件的实现分析• 一文了解ThinkPHP6.0之中间件

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网