seaslog是一个第三方提供的高性能日志扩展,是性能最好的PHP日志框架之一,其代码库地址

https://github.com/SeasX/SeasLog

1.安装

  • 下载安装包时注意版本兼容性,即seaslog版本与PHP版本的兼容性,在seaslogrelease日志里会有PHP版本的支持说明。

  • 预编译与安装,安装方式和其他扩展一样,不清楚可以参考http://404.360tryst.com/views/7.html#layout

./configure --with-php-config=/path/to/php-config
make && make install

执行完以上命令后,在php.ini配置中启动扩展就好

[SeasLog]
;configuration for php SeasLog module
extension = seaslog.so

2.运行时配置

seaslog提供了很多运行时配置,我们可以在php.ini里对服务器进行默认配置,可以可以手动通过ini_set函数进行动态设置。作者服务器运行时配置如下

[seaslog]
extension=seaslog.so
;日志存储的默认根路径。默认值为 "/var/log/www"
seaslog.default_basepath=/tmp/logs/seaslog
;日志格式,json格式
seaslog.default_template="{\"dateTime\":\"%T\",\"level\":\"%L\",\"clientIp\":\"%I\",\"method\":\"%m\",\"host\":\"%D\",\"uri\":\"%R\",\"file\":\"%F\",\"static\":\"%C\",\"msg\":\"%M\",\"requestId\":\"%Q\",\"processId\":\"%P\"}"
;是否按每小时一个记录进行区分。1-Y 0-N(默认值)
seaslog.disting_by_hour=0
;是否按目录进行区分。1-Y(默认值) 0-N
;当 seaslog.disting_folder = 1 时,按目录区分地使用 Logger。 
;这意味着,SeasLog 将为每一个 Logger 创建一个单独的目录进行区分,比如 default/20180211.log
;而当该选项关闭时,SeasLog 将使用下划线连接 Logger 与时间,比如 default_20180211.log。
seaslog.disting_folder=1
;是否按日志级别进行区分。1-Y 0-N(默认值)
;当 seaslog.disting_type = 1 时,按日志级别使用 Logger。 这意味着,SeasLog 将在创建日志文件时,使用 info/warn/error 或其他级别进行区分。
seaslog.disting_type=0
;是否忽略 SeasLog 警告。1-On(默认值) 0-Off
seaslog.ignore_warning=1
;允许日志被记录的级别。默认为 8 (全部日志)。 0-EMERGENCY 1-ALERT 2-CRITICAL 3-ERROR 4-WARNING 5-NOTICE 6-INFO 7-DEBUG 8-ALL
seaslog.level=8
;日志函数所在的层级。这将影响预置变量中的行号取值 `%F`。 默认值为 0。
seaslog.recall_depth=3
;是否接受 SeasLog 抛出异常。1-On(默认值) 0-Off
;当seaslog.throw_exception = 1时,接受 SeasLog 抛出自身的异常, 此时由于日志目录权限问题、或者从>远端 Server 端口不能正常响应而导致的中断, 将抛出一个异常
;而当关闭该选项时,将不抛出异常。
seaslog.throw_exception=1
;自动将 PHP 的 Final Error 记录在默认 Logger中。1-Y(默认值) 0-N
seaslog.trace_error=1
;自动将 PHP 的异常记录在默认 Logger中。1-Y 0-N(默认值)
seaslog.trace_exception=1
;自动将 PHP 的 Warning 记录在默认 Logger中。1-Y 0-N(默认值)
seaslog.trace_warning=1
seaslog.trace_notice=0
;当seaslog.use_buffer = 1时,开启使用内存 Buffer。 
;默认情况下,内存 Buffer 是关闭的。 
;如果 Buffer 是开启状态,SeasLog 会将日志预先记录在内存中, 并且在请求结束时、或 PHP 进程结束时(PHP RSHUTGOWN 或 PHP MSHUTDOWN)时写往存储介质。
seaslog.use_buffer=1
;配置项中 buffer_size 默认值为 0, 这意味着将不使用 Buffer。 
;如果 buffer_size > 0,SeasLog 将预先将日志写入内存 Buffer,并在 Buffer 的条数大于或等于该值时,>写往存储介质,然后刷新内存中的 Buffer。
seaslog.buffer_size=20

seaslog还提供了一些预定义变量,主要用于配置seaslog.default_template

变量含义
%L日志级别
%M日志信息
%T时间,受配置项 seaslog.default_datetime_format的影响
%t时间戳,精确到毫秒,比如:1562892102.862
%Q请求ID。用于区分每一个请求,如果没有调用 SeasLog::setRequestId($string) 函数,将在请求初始化的时候,使用PHP内置函数 static char *get_uniqid ()来生成UniqueID
%H主机名
%P进程ID
%D域名:端口号,比如:404.360tryst.com:443,在Cli下运行时,该值为cli
%R请求URI,比如:/app/login
%m请求URI,请求Method,比如:Get
%I客户端IP,在Cli下运行时,值为local。取值优先级为:HTTP_X_REAL_IP > HTTP_X_FORWARDED_FOR > REMOTE_ADDR
%F文件名:行号,比如:Login.php:113
%U内存使用量,单位为byte。调用PHP内置方法zend_memory_usage得到该值
%u最大内存使用峰值,单位为byte。调用PHP内置方法zend_memory_peak_usage得到该值
%u最大内存使用峰值,单位为byte。调用PHP内置方法zend_memory_peak_usage得到该值

3.使用

编写如下代码

<?php
//0-EMERGENCY 1-ALERT 2-CRITICAL 3-ERROR 4-WARNING 5-NOTICE 6-INFO 7-DEBUG 8-ALL
ini_set('seaslog.level', 6);

\SeasLog::info('app start {datetime}', [
    'datetime' => date('Y-m-d H:i:s')
] );

\SeasLog::debug('this is a debug log {info}', [
    'info' => 'SELECT * FROM user LIMIT 1'
]);

\SeasLog::emergency('app error');

以上例程在fpm模式下访问,会在/tmp/logs/seaslog/default/20200710.log文件记录日志如下

{"dateTime":"2020-07-10 18:18:03","level":"INFO","clientIp":"218.30.116.7","method":"GET","host":"404.360tryst.com","uri":"/log.php","file":"log.php:6","static":"(null)","msg":"app start 2020-07-10 18:18:03","requestId":"5f08405bf09a2","processId":"29982"}
{"dateTime":"2020-07-10 18:18:03","level":"EMERGENCY","clientIp":"218.30.116.7","method":"GET","host":"404.360tryst.com","uri":"/log.php","file":"log.php:13","static":"(null)","msg":"app error","requestId":"5f08405bf09a2","processId":"29982"}

seaslog在记录日志根据级别记录的,并且只会记录级别<= seaslog.level的日志。

我们可以看到,日志中并没有记录debug级别日志,由于我们设置了日志级别是6-INFO,而debug的级别为比6-INFO大的7,所以尽管我们在代码中调用debug方法打日志,但是该级别日志并没有被记录下来,但是6-INFO和0-EMERGENCY级别的日志都被记录了。

学习更多内容: https://404.360tryst.com

我的视频课程: https://edu.csdn.net/course/detail/9933

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐