PHP日志系统SeasLog入门到封装

天大地大妈咪最大 提交于 2020-08-13 03:32:21

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!