使用PHP扩展SeasLog日志系统

白天不知夜晚的黑,项目上线不懂异常的崩盘…危险危险!一起来看看最直接的办法,打造一个日志系统。^_^

日志设计三原则

1.记录系统运行时的信息
2.系统项目日志、应用程序服务日志、安全日志
3.日志功能不能影响用户正常使用

不要犹豫直接选择 SeasLog 扩展

SeasLog是一个C语言编写的PHP扩展,提供一组规范标准的功能函数,在PHP项目中方便、规范、高效地写日志,以及快速地读取和查询日志。

安装SeasLog扩展说明步骤:

  • 下载
    可以进入pecl下载最新的稳定版本
$ wget https://pecl.php.net/get/SeasLog-1.8.4.tgz
  • 解压
$ tar zxvf SeasLog-1.8.4.tgz
$ cd ./SeasLog-1.8.4
  • 编译安装
$ phpize 运行后当前文件下多出configure文件
$ find / -name 'php-config' 查找出php-config文件位置
$ ./configure --with-php-config=/usr/local/bin/php-config
$ make
$ make install
  • 配置php.ini
[SeasLog]
;configuration for php SeasLog module
extension = "/usr/local/opt/php56-seaslog/seaslog.so"

;默认log根目录
seaslog.default_basepath = "/tmp/log/seaslog-test"

;默认logger目录
seaslog.default_logger = "default"

;日期格式配置 默认"Y-m-d H:i:s"
seaslog.default_datetime_format = "Y-m-d H:i:s"

;日志格式模板 默认"%T | %L | %P | %Q | %t | %M"
seaslog.default_template = "%T | %L | %R | %C | %F | %Q | %M"

;是否以目录区分Logger 1是(默认) 0否
seaslog.disting_folder = 1

;是否以type分文件 1是 0否(默认)
seaslog.disting_type = 1

;是否每小时划分一个文件 1是 0否(默认)
seaslog.disting_by_hour = 1

;是否启用buffer 1是 0否(默认)
seaslog.use_buffer = 1

;buffer中缓冲数量 默认0(不使用buffer_size)
seaslog.buffer_size = 100

;cli运行时关闭buffer
;1是 0否(默认)
seaslog.buffer_disabled_in_cli = 0

;记录日志级别,数字越大,根据级别记的日志越多。
;0-EMERGENCY 1-ALERT 2-CRITICAL 3-ERROR 4-WARNING 5-NOTICE 6-INFO 7-DEBUG 8-ALL
;默认8(所有日志)
;
;   注意, 该配置项自1.7.0版本开始有变动。
;   在1.7.0版本之前, 该值数字越小,根据级别记的日志越多: 
;   0-all 1-debug 2-info 3-notice 4-warning 5-error 6-critical 7-alert 8-emergency
;   1.7.0 之前的版本,该值默认为0(所有日志);
seaslog.level = 8

;日志函数调用回溯层级
;影响预定义变量 %F 中的行数
;默认0
seaslog.recall_depth = 0

;自动记录notice 默认0(关闭)
seaslog.trace_notice = 1

;自动记录warning 默认0(开启)
seaslog.trace_warning = 1

;自动记录错误 默认1(开启)
seaslog.trace_error = 1

;自动记录异常信息 默认0(关闭)
seaslog.trace_exception = 1

;日志存储介质 1File 2TCP 3UDP (默认为1)
seaslog.appender = 1

;写入重试次数
;默认0(不重试)
seaslog.appender_retry = 0

;接收ip 默认127.0.0.1 (当使用TCP或UDP时必填)
seaslog.remote_host = "127.0.0.1"

;接收端口 默认514 (当使用TCP或UDP时必填)
seaslog.remote_port = 514

;接收端口的超时时间 默认1秒
seaslog.remote_timeout = 1

;过滤日志中的回车和换行符 (默认为0)
seaslog.trim_wrap = 1

;是否开启抛出SeasLog自身异常  1开启(默认) 0否
seaslog.throw_exception = 1

;是否开启忽略SeasLog自身warning  1开启(默认) 0否
seaslog.ignore_warning = 1

重启PHP服务之后查看phpinfo()中的SeasLog模块:

作者: SeasLog Author Chitao.Gao [ neeke@php.net ]
官方文档: SeasLog Supports

https://github.com/SeasX/SeasLog

实际应用

Seaslog的常用方法

  • 配置方法:
    setBasePath getBasePath setLogger getLastLogger
  • 写日志方法:
    log info notice debug warning error
  • 读日志方法:
    analyzerCount analyzerDetail

代码示例

<?php 
/*设置基本地址*/
$bool_set_base_path = SeasLog::setBasePath('/usr/local/var/www/testseaslog/log');
var_dump($bool_set_base_path);

/*获取基本地址*/
$str_path = SeasLog::getBasePath();
var_dump($str_path);

/*设置模块*/
$bool_set_logger = SeasLog::setLogger('test');
var_dump($bool_set_logger);

/*设置唯一识别ID*/
$bool_reqid = SeasLog::setRequestID('1234567890123');
var_dump($bool_reqid); 

/*记录日志*/
$bool_log = SeasLog::log(SEASLOG_DEBUG, 'log message from {name}',['name'=>'eson']);
var_dump($bool_log);

/*查看日志*/
$data = SeasLog::analyzerDetail(SEASLOG_ALL);
var_dump($data);   

注意:

使用analyzerDetail函数查看日志时:正序使用的是管道调用cat,倒序使用的是tac命令。

<?php
/**
 * 以数组形式,快速取出某类型log的各行详情
 *
 * @param        $level
 * @param string $log_path
 * @param null   $key_word
 * @param int    $start
 * @param int    $limit
 * @param        $order 默认为正序 SEASLOG_DETAIL_ORDER_ASC,可选倒序 SEASLOG_DETAIL_ORDER_DESC
 *
 * @return array
 */
$arr = SeasLog::analyzerDetail(SEASLOG_ALL,'*',NULL,1,20,SEASLOG_DETAIL_ORDER_DESC);

补充:

MacOS下安装使用tac命令:
安装coreutils软件包:

$ brew install coreutils
$ ln -s /usr/local/bin/gtac /usr/local/bin/tac

Thanks♪(・ω・)ノ 感谢你长得那么好看还来看我的博客!see you around ~

00:00/00:00

顾北辰

?偶遇故人点头微笑^_^心像透明水滴☝没有喜悲…?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注