ThinkPHP5的日志

Published on 2016 - 12 - 21

日志初始化

日志记录由\think\Log类完成,主要完成日志记录和跟踪调试。由于日志记录了所有的运行错误,因此养成经常查看日志文件的习惯,可以避免和及早发现很多的错误隐患。

在使用日志记录之前,首先需要初始化日志类,指定当前使用的日志记录方式。

Log::init([
    'type'  =>  'File',
    'path'  =>  APP_PATH.'logs/'
]);

上面在日志初始化的时候,指定了文件方式记录日志,并且日志保存目录为APP_PATH.'logs/'。

如果你没有执行日志初始化操作的话,默认会自动调用配置参数log来进行初始化。

不同的日志类型可能会使用不同的初始化参数。

如果应用需要扩展自己的日志驱动,可以使用:

Log::init([
    'type'  =>  '\org\Log\File',
    'path'  =>  APP_PATH.'logs/'
]);

日志驱动

日志可以通过驱动支持不同的方式写入,默认日志会记录到文件中,系统已经内置的写入驱动包括 File、Socket,如果要临时关闭日志写入,可以设置日志类型为Test即可,例如:

'log'   => [
    // 可以临时关闭日志写入
    'type'  => 'test',
],

File驱动

日志的记录方式默认是File方式,可以通过驱动的方式来扩展支持更多的记录方式。

记录方式由log.type参数配置,例如:

'log'   => [
    // 日志记录方式,支持 file socket
    'type' => 'File',
    //日志保存目录
    'path' => LOG_PATH,
    //单个日志文件的大小限制,超过后会自动记录到第二个文件
    'file_size'     =>2097152,
    //日志的时间格式,默认是` c `
    'time_format'   =>'c'
],

为了避免同一个目录下面的日志文件过多的性能问题,file方式记录的日志文件会自动生成日期子目录。

日志写入

手动记录

一般情况下,系统的日志记录是自动的,无需手动记录,但是某些时候也需要手动记录日志信息,Log类提供了3个方法用于记录日志。

方法 描述
Log::record() 记录日志信息到内存
Log::save() 把保存在内存中的日志信息(用指定的记录方式)写入
Log::write() 实时写入一条日志信息

由于系统在请求结束后会自动调用Log::save方法,所以通常,你只需要调用Log::record记录日志信息即可。

record方法用法如下:

Log::record('测试日志信息');

默认的话记录的日志级别是INFO,也可以指定日志级别:

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

采用record方法记录的日志信息不是实时保存的,如果需要实时记录的话,可以采用write方法,例如:

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

日志级别

ThinkPHP对系统的日志按照级别来分类,并且这个日志级别完全可以自己定义,系统内部使用的级别包括:

  • log 常规日志,用于记录日志
  • error 错误,一般会导致程序的终止
  • notice 警告,程序可以运行但是还不够完美的错误
  • info 信息,程序输出信息
  • debug 调试,用于调试信息
  • sql SQL语句,用于SQL记录,只在数据库的调试模式开启时有效

系统提供了不同日志级别的快速记录方法,例如:

Log::error('错误信息');
Log::info('日志信息');
// 和下面的用法等效
Log::record('错误信息','error');
Log::record('日志信息','info');

还封装了一个助手函数用于日志记录,例如:

trace('错误信息','error');
trace('日志信息','info');

也支持指定级别日志的输入,需要配置信息:

'log'   => [
    'type'  => 'File',
    // 日志记录级别,使用数组表示
    'level' => ['error'],
],

独立日志

为了便于分析,File类型的日志驱动还支持设置某些级别的日志信息单独文件记录,例如:

'log'   => [
    'type'          => 'file', 
    // error和sql日志单独记录
    'apart_level'   =>  ['error','sql'],
],

设置后,就会单独生成error 和 sql两个类型的日志文件,主日志文件中将不再包含这两个级别的日志信息。

独立日志文件按天保存,不限制大小。

日志清空

日志类提供了日志清空的方法,可以在需要的时候手动清空日志,日志清空仅仅是清空内存中的日志。

使用方法如下:

Log::clear();

写入授权

5.0的日志功能支持写入授权,我们可以设置某个请求的日志授权Key,然后设置允许授权写入的配置Key,实现个别用户日志记录的功能,从而提高高负载下面的日志记录性能。

首先需要在应用配置文件或者应用公共文件中添加当前访问的授权Key定义,例如:

// 设置IP为授权Key
Log::key(Request::instance()->ip());

然后在日志配置参数中增加allow_key参数,如下:

'log'   =>  [
    // 日志类型为File
    'type'      =>  'File',
    // 授权只有202.12.36.89 才能记录日志
    'allow_key' =>  ['202.12.36.89'],
]

参考文档