PHP扩展seaslog面面观
目录
seaslog
Log 日志,通常是系统或软件、应用的运行记录。通过 Log 的分析,可以方便用户了解系统或软件、应用的运行情况;如果你的应用 Log 足够丰富,也可以分析以往用户的操作行为、类型喜好、地域分布或其他更多信息;如果一个应用的 Log 同时也分了多个级别,那么可以很轻易地分析得到该应用的健康状况,及时发现问题并快速定位、解决问题,补救损失。
PHP 内置 error_log、syslog 函数功能强大且性能极好,但由于各种缺陷(error_log 无错误级别、无固定格式,syslog 不分模块、与系统日志混合),灵活度降低了很多,不能满足应用需求。
好消息是,有不少第三方的log类库弥补了上述缺陷,如 log4php、plog、monolog 等(当然也有很多应用在项目中自己开发的 Log 类)。
那么有没有一种 Log 类库满足以下需求呢:
- 分模块、分级别
- 配置简单(最好是勿须配置)
- 日志格式清晰易读
- 应用简单、性能很棒 SeasLog 正是应此需求而生。
目前提供了什么:
- 在 PHP 项目中便捷、规范地记录 Log
- 可配置的默认 Log 目录与模块
- 指定 Log 目录与获取当前配置
- 初步的分析预警框架
- 高效的日志缓冲、便捷的缓冲 debug
- 遵循 PSR-3 日志接口规范
- 自动记录错误信息
- 自动记录异常信息
- 连接 TCP 端口,以 RFC5424 格式发送日志
- 连接 UDP 端口,以 RFC5424 格式发送日志
- 支持 RequestId 区分请求
- 支持日志模板自定义
安装扩展
下载
下载页面:https://pecl.php.net/package/seaslog
chenqingji@ubuntu:~/pecl$ wget https://pecl.php.net/get/SeasLog-2.2.0.tgz
解压
tar zxvf SeasLog-2.2.0.tgz
cd SeasLog-2.2.0/
执行PHP安装目录下的phpize
chenqingji@ubuntu:~/pecl/SeasLog-2.2.0$ /usr/bin/phpize
Configuring for:
PHP Api Version: 20160303
Zend Module Api No: 20160303
Zend Extension Api No: 320160303
找到当前系统的php-config文件,同理前面phpize也可以通过whereis搜索到具体路径:
chenqingji@ubuntu:~/pecl/SeasLog-2.2.0$ whereis php-config
php-config: /usr/bin/php-config /usr/bin/php-config7.1 /usr/share/man/man1/php-config.1.gz
配置:
注意:在cd SeasLog-2.2.0/目录中
./configure --with-php-config=/usr/bin/php-config
编译并安装
sudo make
sudo make install
注意:可能有些系统需要足够权限才能编译安装成功,根据具体系统实际情况。
安装成功
Installing shared extensions: /usr/lib/php/20160303/
配置php.ini
;amqp rabbitMQ扩展
extension=/usr/lib/php/20160303/amqp.so
;seaslog 扩展
extension=seaslog.so
在ini尾部补充:
[seaslog]
seaslog.default_basepath = '/var/www/log' ;默认log根目录
seaslog.default_logger = default ;默认日志目录 位于default_basepath目录下的小目录
seaslog.disting_type = 1 ;是否以type分文件 1是 0否(默认) 若是 则每种级别都会单独生成日志文件
seaslog.disting_by_hour = 0 ;是否每小时划分一个文件 1是 0否(默认) 若是 则每个小时都会生成新文件
seaslog.use_buffer = 1 ;是否启用buffer 1是 0否(默认) 默认关闭,当开启此项时,日志预存于内存,当请求结束时(或异常退出时)一次写入文件。
seaslog.buffer_size = 100 ;buffer中缓冲数量 默认0(不使用)
seaslog.level = 0 ;记录日志级别 默认0(所有日志)
seaslog.default_logger的设置,在项目的入口文件中再指定Seaslog::setLogger(‘app1’) 这样也就可以每个项目一个日志目录
注意:如果是cli与fpm的php.ini分开配置,则需要两个php .ini配置文件都要配置。这里我们只配置了fpm模式下ini。
确认扩展安装成功
重启apache或重启php-fpm
比如:
sudo service php7.1-fpm restart
SeasLog 日志8个级别
debug -> info -> notice -> warning -> error -> critical -> alert -> emergency
seaslog类
- SeasLog::alert — 记录 alert 日志
- SeasLog::analyzerCount — Get log count by level, log_path and key_word
- SeasLog::analyzerDetail — Get log detail by level, log_path, key_word, start, limit, order
- SeasLog::closeLoggerStream — Manually release stream flow from logger
- SeasLog::__construct — Description
- SeasLog::critical — 记录 critical 日志
- SeasLog::debug — 记录 debug 日志
- SeasLog::__destruct — Description
- SeasLog::emergency — 记录 emergency 日志
- SeasLog::error — 记录 error 日志
- SeasLog::flushBuffer — 将日志缓存刷新到介质中,文件介质,或者发送到远端的 TCP/UDP 服务地址。
- SeasLog::getBasePath — 获得 SeasLog 根目录
- SeasLog::getBuffer — 获取内存中的日志缓存数组
- SeasLog::getBufferEnabled — Determin if buffer enabled
- SeasLog::getDatetimeFormat — 获取 SeasLog 日期格式
- SeasLog::getLastLogger — 获得 SeasLog 最近的一次 Logger 名称
- SeasLog::getRequestID — 获得当前 SeasLog 中用于区分请求的 request_id
- SeasLog::getRequestVariable — Get SeasLog request variable
- SeasLog::info — Record info log information
- SeasLog::log — 公共的日志记录函数
- SeasLog::notice — 记录 notice 日志
- SeasLog::setBasePath — 设置 SeasLog 根目录
- SeasLog::setDatetimeFormat — 设置 SeasLog 日期格式
- SeasLog::setLogger — 设置 SeasLog 的 Logger 名
- SeasLog::setRequestID — 设置可以由 SeasLog 用于区分请求的 request_id
- SeasLog::setRequestVariable — Manually set SeasLog request variable
- SeasLog::warning — Record warning log information
seaslog简单使用
获取与设置根目录
$basePath1 = SeasLog::getBasePath();
SeasLog::setBasePath('/log/base_test');
$basePath2 = SeasLog::getBasePath();
var_dump($basePath1,$basePath2);
以上输出类似于:
string(12) "/var/log/www"
string(14) "/log/base_test"
获取与设置 Logger
$lastLogger1 = SeasLog::getLastLogger();
SeasLog::setLogger('testModule/app1');
$lastLogger2 = SeasLog::getLastLogger();
var_dump($lastLogger1,$lastLogger2);
以上输出类似于:
string(7) "default"
string(15) "testModule/app1"
快速写入日志
SeasLog::log(SEASLOG_ERROR,'this is a error test by ::log');
SeasLog::debug('this is a {userName} debug',array('{userName}' => 'neeke'));
SeasLog::info('this is a info log');
SeasLog::notice('this is a notice log');
SeasLog::warning('your {website} was down,please {action} it ASAP!',array('{website}' => 'github.com','{action}' => 'rboot'));
SeasLog::error('a error log');
SeasLog::critical('some thing was critical');
SeasLog::alert('yes this is a {messageName}',array('{messageName}' => 'alertMSG'));
SeasLog::emergency('Just now, the house next door was completely burnt out! {note}',array('{note}' => 'it`s a joke'));
日志的默认模板是 seaslog.default_template = “%T | %L | %P | %Q | %t | %M”. 这意味着,在默认情况下,日志的记录格式是: {dateTime} | {level} | {pid} | {uniqid} | {timeStamp} | {logInfo}
.
如果设置:seaslog.appender = 1
以上输出类似于:
2020-07-27 08:53:52 | ERROR | 23625 | 599159975a9ff | 1406422432.786 | this is a error test by log
2020-07-27 08:53:52 | DEBUG | 23625 | 599159975a9ff | 1406422432.786 | this is a neeke debug
2020-07-27 08:53:52 | INFO | 23625 | 599159975a9ff | 1406422432.787 | this is a info log
2020-07-27 08:53:52 | NOTICE | 23625 | 599159975a9ff | 1406422432.787 | this is a notice log
2020-07-27 08:53:52 | WARNING | 23625 | 599159975a9ff | 1406422432.787 | your github.com was down,please rboot it ASAP!
2020-07-27 08:53:52 | ERROR | 23625 | 599159975a9ff | 1406422432.787 | a error log
2020-07-27 08:53:52 | CRITICAL | 23625 | 599159975a9ff | 1406422432.787 | some thing was critical
2020-07-27 08:53:52 | EMERGENCY | 23625 | 599159975a9ff | 1406422432.787 | Just now, the house next door was completely burnt out! it is a joke
快速获取某级别下日志的数量
SeasLog 通过系统命令管道调用 grep -wc
获取数量,并返回给 PHP (返回数组或单个数值).
$countResult1 = SeasLog::analyzerCount();
$countResult2 = SeasLog::analyzerCount(SEASLOG_WARNING);
$countResult3 = SeasLog::analyzerCount(SEASLOG_ERROR,date('Ymd',time()));
var_dump($countResult1,$countResult2,$countResult3);
以上输出类似于:
array(8) {
["DEBUG"]=>
int(3)
["INFO"]=>
int(3)
["NOTICE"]=>
int(3)
["WARNING"]=>
int(3)
["ERROR"]=>
int(6)
["CRITICAL"]=>
int(3)
["ALERT"]=>
int(3)
["EMERGENCY"]=>
int(3)
}
int(7)
int(1)
获取某级别下日志的详情
SeasLog 通过系统命令管道调用 grep -w
获取日志详情,并返回数组给 PHP.
$detailErrorArray = SeasLog::analyzerDetail(SEASLOG_ERROR);
var_dump($detailErrorArray);
var_dump(SeasLog::analyzerDetail(SEASLOG_ERROR,date('Ymd',time())));
以上输出类似于:
array(6) {
[0] =>
string(83) "2020-02-24 00:14:02 | ERROR | 8568 | 599157af4e937 | 1393172042.717 | test error 3 "
[1] =>
string(83) "2020-02-24 00:14:04 | ERROR | 8594 | 5991576584446 | 1393172044.104 | test error 3 "
[2] =>
string(83) "2020-02-24 00:14:04 | ERROR | 8620 | 1502697015147 | 1393172044.862 | test error 3 "
[3] =>
string(83) "2020-02-24 00:14:05 | ERROR | 8646 | 599159975a9ff | 1393172045.989 | test error 3 "
[4] =>
string(83) "2020-02-24 00:14:07 | ERROR | 8672 | 599159986ec28 | 1393172047.882 | test error 3 "
[5] =>
string(83) "2020-02-24 00:14:08 | ERROR | 8698 | 5991599981cec | 1393172048.736 | test error 3 "
}
array(2) {
[0] =>
string(83) "2020-02-24 00:14:02 | ERROR | 8568 | 599157af4e937 | 1393172042.717 | test error 3 "
[1] =>
string(83) "2020-02-24 00:14:04 | ERROR | 8594 | 5991576584446 | 1393172044.104 | test error 3 "
}
markdown @tsingchan
引用格式为收藏注解,比如本句就是注解,非作者原文。