ThinkPHP 6.0的日志文件操作和管理

摘要

在TP6框架下,日志文件的读写操作非常重要,而这一点,在我们的编程开发中往往容易被忽略,所以网上关于这方面的讨论不多。本文主要针对我们项目开发过程中遇到的这方面问题做总结,记录踩过的坑,标记遇到的雷,以供记录和备忘。

ThinkPHP框架每个版本对日志文件的读写操作都不一样,版本升级没有连续性,对应的log的配置文件也各异,这点与WordPress不同。WordPress虽然版本升级很快,而且现在完全抛弃了PHP 5.X系列,只支持PHP 7.0及以上,但是每个版本升级,向下兼容性都做得非常好,包括数据库表结构的升级,都有对应的自动脚本,这一点,国内的程序员的确需要多向人家学习,取长补短。

在TP6框架下,日志文件的读写操作非常重要,而这一点,在我们的编程开发中往往容易被忽略,所以网上关于这方面的讨论不多。本文主要针对我们项目开发过程中遇到的这方面问题做总结,记录踩过的坑,标记遇到的雷,以供记录和备忘。

日志文件输出目录

TP6的日志文件的主要配置文件在config目录下的log.php中,默认的配置中,日志文件的默认保存路径为:

runtime/index/log/20xx.xx.xx.log 

其中的index为子应用(多应用模式下,对应TP3.1中的group组)的名称,不同的子应用名称不同,例如app_name,app001等。

但是我们平时会将多个应用作为一个项目管理,不同的子应用的日志写在不同的目录下,查看和维护很不方便,特殊是需要综合分析一个请求的处理过程,基本都是后端程序员的事情,分散的日志反而不利于发现问题。

那么有什么方式可以将日志集中到统一的日志文件中呢?其实,在ThinkPHP6.0的框架下,可以通过修改config目录下的log.php来实现,设置指定日志文件目录的设置项为“channel/file/path”。

<?php

// +----------------------------------------------------------------------
// | 日志设置
// +----------------------------------------------------------------------
return [
    // 默认日志记录通道
    'default'      => env('log.channel', 'file'),
    // 日志记录级别
    'level'        => ['emergency','alert','critical','error','warning','notice','info','debug','sql'],
    // 日志类型记录的通道 ['error'=>'email',...]
    'type_channel' => [],
    // 关闭全局日志写入
    'close'        => false,
    // 全局日志处理 支持闭包
    'processor'    => null,

    // 日志通道列表
    'channels'     => [
        'file' => [
            // 日志记录方式
            'type'           => 'File',
            // 日志保存目录
            'path'           => app()->getRootPath().'runtime/log/',
            // 单文件日志写入
            'single'         => false,
            // 独立日志级别
            'apart_level'    => [],
            // 最大日志文件数量
            'max_files'      => 100,
            // 使用JSON格式记录
            'json'           => false,
            // 日志处理
            'processor'      => null,
            // 关闭通道日志写入
            'close'          => false,
            // 日志输出格式化
            'format'         => '[%s][%s] %s',
            // 是否实时写入
            'realtime_write' => true,
        ],
        // 其它日志通道配置
    ],

];

以上最关键的项目是“path”这个设置项,用到的函数“app()->getRootPath()”可以自动获取项目运行的硬盘的物理路径,其中的app()是TP6框架中的超级函数。

与TP3.1不同,在TP6中引入日志通道的概念,通过“type_channel”可以将不同的日志使用不同的通道,配置示例如下:

return [
	'default' => 'file',
	'type_channel' => [
		'error' => 'email',
		'sql' => 'sql',
	],
	'channels' => [
		'file' => [
			'type' => 'file',
		],
		'email' => [
			'type' => 'email',
		],
		'sql' => [
			'type' => 'sql',
		],
	],
];

如果日志类型为error,则使用email这个通道;如果日志类型为sql,则使用sql这个通道(channel) 。同时,你可以在写日志的时候,使用不同的通道,例如:

Log::channel('email')->info('一条测试日志');
Log::channel('socket')->error('记录错误日志');

写日志文件

写日志文件最常用的代码为:

Log::write('测试日志信息,这是警告级别,并且实时写入','notice');

日志文件的默认级别为“info”,通过write方式实时写入文件;也可以通过record和save来通过内存方式提高写日志的效率。

Log::record('测试日志信息,这是警告级别','notice');
Log::save();

ThinkPHP对系统的日志按照级别来分类记录,按照 PSR-3 日志规范,日志的级别从低到高依次为: debug , info , notice , warning , error , critical , alert , emergency , ThinkPHP额外增加了一个 sql 日志级别仅用于记录 SQL 日志(并且仅当开启数据库调试模式有效)。

以上是日常主要的写日志方式,参考TP6的使用手册,框架同时提供了助手函数trace,具体使用方式为:

trace('这是一条日志记录');

使用此方法写日志更简单,不需要use相关的package,建议采用。除了trace函数之外,ThinkPHP 6.0还提供了很多助手函数,另文说明。

admin

目前评论:2   其中:访客  0   博主  0

  1. avatar APP体验员D 3

    这个框架功能还是比较强大的!

  2. avatar 幽忧岁月 0

    好文章!

评论加载中...

发表评论: 使用手机百度APP扫描左侧二维码, 或者微信扫描右侧太阳码