作者简介:

       姜海强:闷骚码农,互联网行业摸爬滚打数余载,先后担任中国体育直播TV主程、网信集团先锋支付架构师、奇虎360服务器端资深开发。热爱技术,喜欢分享,热衷领域:PHP/Golang语言、面向对象设计模式、Redis、Yaf、Yii2、微服务等。

视频课程

yaf+yar微服务-腾讯课堂
yaf+yar微服务-51CTO学院
CSDN学院

Github

个人主页
swoole-boot
roach
roach-orm

QQ群:

姜海强的QQ群

公众号:

360tryst公众号

seaslog

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

https://github.com/SeasX/SeasLog

1.安装

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

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

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

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

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

2.运行时配置

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

  1. [seaslog]
  2. extension=seaslog.so
  3. ;日志存储的默认根路径。默认值为 "/var/log/www"
  4. seaslog.default_basepath=/tmp/logs/seaslog
  5. ;日志格式,json格式
  6. 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\"}"
  7. ;是否按每小时一个记录进行区分。1-Y 0-N(默认值)
  8. seaslog.disting_by_hour=0
  9. ;是否按目录进行区分。1-Y(默认值) 0-N
  10. ;当 seaslog.disting_folder = 1 时,按目录区分地使用 Logger
  11. ;这意味着,SeasLog 将为每一个 Logger 创建一个单独的目录进行区分,比如 default/20180211.log
  12. ;而当该选项关闭时,SeasLog 将使用下划线连接 Logger 与时间,比如 default_20180211.log
  13. seaslog.disting_folder=1
  14. ;是否按日志级别进行区分。1-Y 0-N(默认值)
  15. ;当 seaslog.disting_type = 1 时,按日志级别使用 Logger 这意味着,SeasLog 将在创建日志文件时,使用 info/warn/error 或其他级别进行区分。
  16. seaslog.disting_type=0
  17. ;是否忽略 SeasLog 警告。1-On(默认值) 0-Off
  18. seaslog.ignore_warning=1
  19. ;允许日志被记录的级别。默认为 8 (全部日志)。 0-EMERGENCY 1-ALERT 2-CRITICAL 3-ERROR 4-WARNING 5-NOTICE 6-INFO 7-DEBUG 8-ALL
  20. seaslog.level=8
  21. ;日志函数所在的层级。这将影响预置变量中的行号取值 `%F` 默认值为 0
  22. seaslog.recall_depth=3
  23. ;是否接受 SeasLog 抛出异常。1-On(默认值) 0-Off
  24. ;当seaslog.throw_exception = 1时,接受 SeasLog 抛出自身的异常, 此时由于日志目录权限问题、或者从>远端 Server 端口不能正常响应而导致的中断, 将抛出一个异常
  25. ;而当关闭该选项时,将不抛出异常。
  26. seaslog.throw_exception=1
  27. ;自动将 PHP Final Error 记录在默认 Logger中。1-Y(默认值) 0-N
  28. seaslog.trace_error=1
  29. ;自动将 PHP 的异常记录在默认 Logger中。1-Y 0-N(默认值)
  30. seaslog.trace_exception=1
  31. ;自动将 PHP Warning 记录在默认 Logger中。1-Y 0-N(默认值)
  32. seaslog.trace_warning=1
  33. seaslog.trace_notice=0
  34. ;当seaslog.use_buffer = 1时,开启使用内存 Buffer
  35. ;默认情况下,内存 Buffer 是关闭的。
  36. ;如果 Buffer 是开启状态,SeasLog 会将日志预先记录在内存中, 并且在请求结束时、或 PHP 进程结束时(PHP RSHUTGOWN PHP MSHUTDOWN)时写往存储介质。
  37. seaslog.use_buffer=1
  38. ;配置项中 buffer_size 默认值为 0 这意味着将不使用 Buffer
  39. ;如果 buffer_size > 0SeasLog 将预先将日志写入内存 Buffer,并在 Buffer 的条数大于或等于该值时,>写往存储介质,然后刷新内存中的 Buffer
  40. 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.使用

编写如下代码

  1. <?php
  2. //0-EMERGENCY 1-ALERT 2-CRITICAL 3-ERROR 4-WARNING 5-NOTICE 6-INFO 7-DEBUG 8-ALL
  3. ini_set('seaslog.level', 6);
  4. \SeasLog::info('app start {datetime}', [
  5. 'datetime' => date('Y-m-d H:i:s')
  6. ] );
  7. \SeasLog::debug('this is a debug log {info}', [
  8. 'info' => 'SELECT * FROM user LIMIT 1'
  9. ]);
  10. \SeasLog::emergency('app error');

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

  1. {"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"}
  2. {"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级别的日志都被记录了。

QQ群:

姜海强的QQ群

公众号:

360tryst公众号