目录

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

引用格式为收藏注解,比如本句就是注解,非作者原文。