阿里云协同办公工具Teambition 0元试用>>>
- 目录
- 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,总会对新事物有些许抵触感,并且认为挺高级的、有点难懂,但当你真正投身去实践,其实一点难度也没有,所以,对于新事物,要敢于接受和尝试,即便不懂,多尝试几次、多看一些大牛总结的博客文章,总有一天就会发出真香理论。