- 目录
- 1. 前言
- 2.安装配置seaslog
- 2.1下载地址
- 2.2编译安装
- 2.2.1linux下安装
- 2.2.2window下安装
- 2.3配置php.ini
- 2.4自定义日志模板
- 2.4.1自定义日志模版变量表
- 2.4.2日志模板说明
- 3.seaslog的常用方法
- 3.1 常量列表
- 3.2函数使用说明
- 3.2.1获取getBasePath与设置setBasePath
- 3.2.2设置setLogger与获取getLastLogger
- 3.2.3快速写入log
- 3.2.4SeasLog Analyzer的使用
- 4. 总结
1.前言
系统日志,通常是记录系统运行时系统日志、应用程序日志、安全日志信息,而且日志功能不能影响用户正常使用。php内置error_log、syslog函数功能强大且性能极好,但由于各种缺陷(error_log无错误级别、无固定格式,syslog不分模块、与系统日志混合),灵活度降低了很多,不能满足应用需求。而SeasLog则满足分模块、分级别、配置简单、功能完善、高性能、日志格式清晰易读的需求,下面一起掌握它吧!
代码分享: https://github.com/mtdgclub/libraryClass
详见 SeasLog.class.php 文件
2.安装配置seaslog
2.1下载地址
http://pecl.php.net/package/SeasLog
2.2编译安装
2.2.1linux下安装
$ wget https://github.com/Neeke/SeasLog/archive/master.zip $ unzip master.zip $ cd /path/to/SeasLog $ phpize $ ./configure --with-php-config=/path/to/php-config $ make -j2 $ sudo make install
2.2.2window下安装
将下载的配置包解压,拷贝php_seaslog.dll到对应版本php的ext文件下。
2.3配置php.ini
这里以window环境下配置为例,Linux下略有不同
[SeasLog]
extension=php_seaslog.dll
;默认log根目录
seaslog.default_basepath = '/log/seaslog/'
;默认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 | %P | %Q | %t | %M"
;是否以type分文件 1 是 0 否(默认)
seaslog.disting_type = 0
;是否每小时划分一个文件 1 是 0 否(默认)
seslog.disting_by_hour = 0
;是否启用buffer 1 是 0 否(默认)
seaslog.use_buffer = 100
;buffer中缓冲数量 默认0(不使用buffer)
seaslog.buffer_size = 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
;自动记录错误 默认1(开启)
seaslog.trace_error = 1
;自动记录异常信息 默认0(关闭)
seaslog.trace_exception = 0
;日志存储介质 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
;过滤日志中的回车和换行符 (默认为0)
seaslog.trim_wrap = 0
;是否开启抛出SeasLog自身异常 1开启(默认) 0否
seaslog.throw_exception = 1
;是否开启忽略SeasLog自身warning 1开启(默认) 0否
seaslog.ignore_warning = 1
最后重启服务器,查看phpinfo()
PS:seaslog.level等级不同,记录信息不同。
seaslog.level = 8 记录的日志级别.默认为8,即所有日志均记录。 seaslog.level = 0 记录EMERGENCY。 seaslog.level = 1 记录EMERGENCY、ALERT。 seaslog.level = 2 记录EMERGENCY、ALERT、CRITICAL。 seaslog.level = 3 记录EMERGENCY、ALERT、CRITICAL、ERROR。 seaslog.level = 4 记录EMERGENCY、ALERT、CRITICAL、ERROR、- WARNING。 seaslog.level = 5 记录EMERGENCY、ALERT、CRITICAL、ERROR、WARNING、NOTICE。 seaslog.level = 6 记录EMERGENCY、ALERT、CRITICAL、ERROR、WARNING、NOTICE、INFO。 seaslog.level = 7 记录EMERGENCY、ALERT、CRITICAL、ERROR、WARNING、NOTICE、INFO、DEBUG。
2.4自定义日志模板
在使用过程中提到自定义日志模板的需求,于是自1.7.2版本开始,拥有了这个能力,允许用户自定义日志的模板, 同时在模板中可以使用预置的诸多预设变量。
2.4.1自定义日志模版变量表
SeasLog提供了下列预设变量,可以直接使用在日志模板中,将在日志最终生成时替换成对应值。
模板 |
格式 |
备注 |
%L |
Level |
日志级别 |
%M |
Message |
日志信息 |
%T |
DateTime |
如2017-08-16 19:15:02,受seaslog.default_datetime_format影响 |
%t |
Timestamp |
如1502882102.862,精确到毫秒数 |
%Q |
RequestId |
区分单次请求,如没有调用SeasLog::setRequestId($string)方法,则在初始化请求时,采用内置的static char *get_uniqid()方法生成的惟一值 |
%H |
HostName |
主机名 |
%P |
ProcessId |
进程ID |
%D |
Domain:Port |
域名:口号,如www.cloudwise.com:8080; Cli模式下为cli |
%R |
Request URI |
请求URI,如/app/user/signin; Cli模式下为入口文件,如CliIndex.php |
%m |
Request Method |
请求类型,如GET; Cli模式下为执行命令,如/bin/bash |
%I |
Client IP |
来源客户端IP; Cli模式下为local。取值优先级为:HTTP_X_REAL_IP > HTTP_X_FORWARDED_FOR > REMOTE_ADDR
|
%F |
FileName:LineNo |
文件名:行号,如UserService.php:118 |
%C |
TODO Class::Action |
类名::方法名,如UserService::getUserInfo |
2.4.2日志模板说明
模板默认为:seaslog.default_template = "%T | %L | %P | %Q | %t | %M"
默认的格式为{dateTime} | {level} | {pid} | {uniqid} | {timeStamp} | {logInfo}
真实案例:2020-05-09 10:31:58 | DEBUG | 10012 | 5eb6161dd598e | 1588991518.904 | debug日志
如果自定义模板为:seaslog.default_template = "[%T]:%L %P %Q %t %M"
自定义日志格式为:[{dateTime}]:{level} {pid} {uniqid} {timeStamp} {logInfo}
真实案例:[2020-05-09 10:31:58] :{DEBUG} {10012} {5eb6161dd598e} {1588991518.904}{debug日志}
PS:%L 必须在%M之前,就是说日志级别在日志内容之前。
3.seaslog的常用方法
配置方法:setBasePath,getBasePath,setLogger,getLastLogger
写日志方法:log,info,notice,debug,warning,error
读日志方法:analyzerCount,analyzerDetail
3.1 常量列表
SeasLog 共将日志分成8个级别
级别 |
简写 |
备注 |
SEASLOG_DEBUG |
DEBUG |
debug信息、细粒度信息事件 |
SEASLOG_INFO |
INFO |
重要事件、强调应用程序的运行过程 |
SEASLOG_NOTICE |
NOTICE |
一般重要性事件、执行过程中较INFO级别更为重要的信息 |
SEASLOG_WARNING |
WARNING |
出现了非错误性的异常信息、潜在异常信息、需要关注并且需要修复 |
SEASLOG_ERROR |
ERROR |
运行时出现的错误、不必要立即进行修复、不影响整个逻辑的运行、需要记录并做检测 |
SEASLOG_CRITICAL |
CRITICAL |
紧急情况、需要立刻进行修复、程序组件不可用 |
SEASLOG_ALERT |
ALERT |
必级立即采取行动的紧急事件、需要立即通知相关人员紧急修复 |
SEASLOG_EMERGENCY |
EMERGENCY |
系统不可用 |
3.2函数使用说明
3.2.1获取getBasePath与设置setBasePath
设置日志存储路径,第一次存储将按照配置在php.ini文件的配置路径存储,因此在调用前应将日志存储路径改为网站的日志存储路径。
SeasLog::getBasePath() 第一次获取将得到php.ini(seaslog.ini)中设置的seaslog.default_basepath 的值 SeasLog::setBasePath() 使用 SeasLog::setBasePath() 函数,将改变 SeasLog::getBasePath() 的取值
比如以下代码,在构造函数时候对存储路径进行设定
private static $config = [
'path'=>'/log/seaslog',//存储路径
'php'=>'php',//存储模块文件名
'request'=>'request',
'sql'=>'sqld'
];
public function __construct()
{
//日志初始化路径
$old_path = \SeasLog::getBasePath();
if($old_path != self::$config['path']){
\SeasLog::setBasePath(self::$config['path']);
}
}
3.2.2设置setLogger与获取getLastLogger
一个网站可能分为多个模块运作,因此当我们希望按照模块分别记录对应日志,那么就需要设置对应的logger,将日志存储到对应文件夹下。
SeasLog::getLastLogger() 直接使用 SeasLog::getLastLogger(),将获取php.ini(seaslog.ini)中设置的seaslog.default_logger的值 SeasLog::setLogger() 使用 SeasLog::setLogger() 函数,将改变 SeasLog::getLastLogger()的取值。
比如如下代码,建立选择日志存储模块函数
/**
* 选择日志存储模块,分别记录日志
* @param string $loggerName 模块名
* @return bool
*/
public static function setLogger($loggerName)
{
//获得上一个logger目录,为空默认是default
$lastLogger = \SeasLog::getLastLogger();
$logger = self::$config[$loggerName];
if($lastLogger != $logger){
\SeasLog::setLogger($logger);
}
return true;
}
3.2.3快速写入log
根据等级有如下写日志方法:
\SeasLog::debug($message, $context, $module) \SeasLog::info($message, $context, $module) \SeasLog::notice($message, $context, $module) \SeasLog::warning($message, $context, $module) \SeasLog::error($message, $context, $module) \SeasLog::critical($message, $context, $module) \SeasLog::alert($message, $context, $module) \SeasLog::emergency($message, $context, $module)
使用演示如下:
SeasLog::debug('this is a {userName} debug',array('{userName}' => 'neeke'));
PS:目前暂不支持自定义日志文件名,但可以根据配置决定已有的文件名格式,log记录目录 = basePath / logger / {fileName}.log log文件名,默认以 年月日 分文件,如今天是2014年02月18日期,那么 {fileName} = 20140218;默认的 是seaslog.disting_type = 0,如果今天我使用了 SeasLog ,那么将产生最终的log文件:LogFile = basePath / logger / 20140218.log;如果seaslog.disting_type = 1,那么log记录目录 = basePath / logger / {fileName}_{level}.log log文件名,如果今天我使用了 SeasLog ,那么将产生最终的log文件:LogFile = basePath / logger / 20140218_DEBUG.log
3.2.4SeasLog Analyzer的使用
3.2.4.1快速统计某类型log的count值
/**
* 快速统计某类型log的count值
* @param string $level SEASLOG_WARNING SEASLOG_ERROR
* @param string $date Ymd 比如:20200509
*/
static public function analyzerCount($level,$date=''){
$date = date('Ymd',strtotime($date));
if(!empty($level) AND !empty($date)){
$countResult = \SeasLog::analyzerCount($level,$date);
}elseif(!empty($level) AND empty($date)){
$countResult = \SeasLog::analyzerCount($level);
}else{
$countResult = \SeasLog::analyzerCount();
}
return $countResult;
}
3.2.4.2获取某类型log列表
/**
* 获取某类型log列表,查看信息里面有什么内容
* @param string $level SEASLOG_WARNING SEASLOG_ERROR ..... 或者简写 debug warning error.....
* @param string $date Ymd 比如:20200509
* @return mixed
*/
public function analyzerDetail($level,$date=''){
$date = date('Ymd',strtotime($date));
if(!empty($level) AND !empty($date)){
$detailErrorArray = \SeasLog::analyzerDetail($level,$date);
}elseif(!empty($level) AND empty($date)){
$detailErrorArray = \SeasLog::analyzerDetail($level);
}else{
$detailErrorArray = \SeasLog::analyzerDetail();
}
return $detailErrorArray;
}
4.总结
刚开始接触seaslog,总会对新事物有些许抵触感,并且认为挺高级的、有点难懂,但当你真正投身去实践,其实一点难度也没有,所以,对于新事物,要敢于接受和尝试,即便不懂,多尝试几次、多看一些大牛总结的博客文章,总有一天就会发出真香理论。
来源:oschina
链接:https://my.oschina.net/mtdg/blog/4273817