您的位置:时时app平台注册网站 > 彩世界网址 > 使用SeasLog打造PHP项目中的高性能日志组件(1)彩世

使用SeasLog打造PHP项目中的高性能日志组件(1)彩世

2019-09-14 01:24

选取SeasLog创设PHP项目中的高品质日志组件(1)

什么是SeasLog

SeasLog是二个C语言编写的PHP扩张,提供一组正式标准的功用函数,在PHP项目中有益、标准、高效地写日记,以及便捷地读取和询问日志。

干什么接纳SeasLog

不管在什么应用中,log日志都以架设中不得缺点和失误的多少个至关心体贴要组成部分,它一般是系统或软件、应用的周转记录。通过log的深入分析,能够方便顾客明白系统或软件、应用的运行景况;假诺您的行使log足够丰裕,也足以分析过去客户的操作行为、类型喜好、地域分布或另外更加多音讯;假设三个应用的log同期也分了八个等第,那么能够很随意地深入分析获得该使用的健康情状,及时开掘难题并飞快稳固、消除难点,补救损失。

我们理解,php内置了累累log函数,如error_log、syslog、file_put_content,这么些函数效用庞大且质量极好,但鉴于各样缺点(error_log、file_put_content无不当等级、无固定格式疑似信马由缰随处乱画;syslog不区分模块、並且与系统日志混合,读syslog记录会令人抓狂的。),灵活度收缩了无数,很不能够满意使用要求。基本上全数的开拓者,都会自行设计封装log库,当然也有那多少个开辟者选拔已部分开源日志库。

也是有为数非常多开源log类库弥补了上述缺陷,如log4php、plog、Analog等(当然也许有多数运用在档案的次序中温馨开销的log类)。在那之中以log4php最为有名,它的打算特出、格式完美、文书档案完善、功用强大。不过经过测验,log4php的脾气非常差。

彩世界网址 1

那是log4php与SeasLog的习性相比图:

安插思路

那么有未有一种log类库同时知足以下供给呢:

●分模块、分级别

●配置不难(最棒是勿须配备)

●日志格式清晰易读

●应用轻松、品质很棒

作者们明白,PS奥迪Q3-3典型是一个国际化的日记规范,它须要了“模块、品级、清晰、易用”等日志职业应具备的表征。由此,只要大家根据了PS昂Cora-3标准,则大家能够做到“分模块、分等级”以及“日志格式清晰易读”的供给。

“配置轻松”那一个需求也很好成功。借使严厉依照既定准绳,其实只须求安装暗许目录就能够了。

OK,未来我们只剩余“品质”那多个供给。

既然是日记,免不了会写文件,只怕通过pipe通过互连网传递到有个别存款和储蓄中央(大家暂不思虑存款和储蓄主题的安排性)。能够推论,假若三个乞请中供给写出一千处log,那么势必会有一千次IO,那对品质将是二个比不小的贻误点。一般对于拍卖这种一再同样的伏乞场景,大家要化解的骨子里也很简短,使用cache或buffer,把多次伸手作归并,从而减弱对磁盘或网络的IO,那是一个基本的思索。

SeasLog也是那般做的。设定二个buffer_size(暗许100条log),使用PHP乞求内部存款和储蓄器,每写贰遍log,塞入内部存款和储蓄器,同一时间buffer_size加;当buffer_size等于设置值时,则展开贰回IO,同期排除buffer; 当然,假诺央浼甘休了、或施行了die、exit或别的十分退出时,不管buffer_size有未有攒够设置值,立刻张开二遍IO,同一时候免去buffer。

到方今结束,SeasLog的科班版本为1.1.6,选取Apache 2.0开源左券,同一时间能够在php.net官方,和Github库上得到它的总体代码。

Php.net

Github

现阶段提供了怎么着

●在PHP项目中便捷、标准地记录log

●可安插的私下认可log目录与模块

●钦定log目录与收获当前布局

●早先的分析预先警告框架

●高效的日记缓冲、便捷的缓冲debug

●遵守 PSEvoque-3 日志接口标准

怎么设置

收获源码后,可机关编写翻译。

$ /path/to/phpize

$ ./configure --with-php-config=/path/to/php-config 

$ make && make install

理当如此,使用PECL管理工科具会更方便: 

$ pecl install seaslog

seaslog.ini的配置

; configuration for php SeasLog module extension = seaslog.so seaslog.default_basepath = /log/seaslog-test    ;默认log根目录 seaslog.default_logger = default                ;默认logger目录 seaslog.disting_type = 1                            ;是否以type分文件 1是 0否(默认) seaslog.disting_by_hour = 1                      ;是否每小时划分一个文件 1是 0否(默认) seaslog.use_buffer = 1                              ;是否启用buffer 1是 0否(默认) seaslog.buffer_size = 100                         ;buffer中缓冲数量 默认0(不使用buffer_size) seaslog.level = 0                                       ;记录日志级别 默认0(所有日志) 

seaslog.disting_type = 1 开启以type分文件,即log文件分别infowarnerro

seaslog.disting_by_hour = 1 敞开每刻钟划分三个文本

seaslog.use_buffer = 1 开启buffer。暗中认可关闭。当展开此项时,日志预存于内部存款和储蓄器,当呼吁甘休时(或特别退出时)一遍写入文件。

seaslog.buffer_size = 100 设置缓冲数量为100. 默以为0,即无缓冲数量限制.当buffer_size大于0时,缓冲量达到该值则写贰回文件. 

seaslog.level = 3 记录的日志品级.默感觉0,即怀有日志均记录。当level为1时,关怀debug以上品级(包蕴debug),依此类推。level大于8时,全部日志均不记录。


彩世界网址 2


) 什么是SeasLog SeasLog是一个C语言编写的PHP增添,提供一组正式标准的法力函数,在PHP项目中方便...

编写翻译安装 seaslog

$ /path/to/phpize
$ ./configure --with-php-config=/path/to/php-config
$ make && make install
SEASLOG_INFO
  • "INFO" - 主要事件、重申应用程序的运营进度

seaslog.ini的配置

 ; configuration for php SeasLog module
extension = seaslog.so
seaslog.default_basepath = /log/seaslog-test    ;默认log根目录
seaslog.default_logger = default                ;默认logger目录
seaslog.disting_type = 1                        ;是否以type分文件 1是 0否(默认)
seaslog.disting_by_hour = 1                     ;是否每小时划分一个文件 1是 0否(默认)
seaslog.use_buffer = 1                          ;是否启用buffer 1是 0否(默认)

seaslog.disting_type = 1 拉开以type分文件,即log文件分别infowarnerro

seaslog.disting_by_hour = 1 敞开每时辰划分二个文本

seaslog.use_buffer = 1 开启buffer。暗中同意关闭。当张开此项时,日志预存于内部存储器,当呼吁停止时(或极度退出时)一回写入文件。

常量与函数

常量列表

* SEASLOG_DEBUG                       "debug"
* SEASLOG_INFO                        "info"
* SEASLOG_NOTICE                      "notice"
* SEASLOG_WARNING                     "warning"
* SEASLOG_ERROR                       "error"
* SEASLOG_CRITICAL                    "critical"
* SEASLOG_ALERT                       "alert"
* SEASLOG_EMERGENCY                   "emergency"


var_dump(SEASLOG_DEBUG,SEASLOG_INFO,SEASLOG_NOTICE);
/*
string('debug') debug级别
string('info')  info级别
string('notice') notice级别
*/

函数列表

SeasLog 提供了这么一组函数,可以一本万利地收获与安装根目录、模块目录、快捷写入与总括log。 相信从下述伪代码的笺注中,您可以长足获得函数音信,具体使用将紧接其后:

<?php
/**
 * @author ciogao@gmail.com
 * Date: 14-1-27 下午4:47
 */


class SeasLog
{
    public function __construct()
    {
        #SeasLog init
    }


    public function __destruct()
    {
        #SeasLog distroy
    }


    /**
     * 设置basePath
     * @param $basePath
     * @return bool
     */
    static public function setBasePath($basePath)
    {
        return TRUE;
    }


    /**
     * 获取basePath
     * @return string
     */
    static public function getBasePath()
    {
        return 'the base_path';
    }


    /**
     * 设置模块目录
     * @param $module
     * @return bool
     */
    static public function setLogger($module)
    {
        return TRUE;
    }


    /**
     * 获取最后一次设置的模块目录
     * @return string
     */
    static public function getLastLogger()
    {
        return 'the lastLogger';
    }


    /**
     * 统计所有类型(或单个类型)行数
     * @param $level
     * @param string $log_path
     * @return array | long
     */
    static public function analyzerCount($level = 'all',$log_path = '*')
    {
        return array();
    }


    /**
     * 以数组形式,快速取出某类型log的各行详情
     * @param $level
     * @param string $log_path
     * @return array
     */
    static public function analyzerDetail($level = SEASLOG_INFO,$log_path = '*')
    {
        return array();
    }


    /**
     * 获得当前日志buffer中的内容
     * @return array
     */
    static public function getBuffer()
    {
        return array();
    }


    /**
     * 记录debug日志
     * @param $message
     * @param array $content
     * @param string $module
     */
    static public function debug($message,array $content = array(),$module = '')
    {
        #$level = SEASLOG_DEBUG
    }


    /**
     * 记录info日志
     * @param $message
     * @param array $content
     * @param string $module
     */
    static public function info($message,array $content = array(),$module = '')
    {
        #$level = SEASLOG_INFO
    }


    /**
     * 记录notice日志
     * @param $message
     * @param array $content
     * @param string $module
     */
    static public function notice($message,array $content = array(),$module = '')
    {
        #$level = SEASLOG_NOTICE
    }


    /**
     * 记录warning日志
     * @param $message
     * @param array $content
     * @param string $module
     */
    static public function warning($message,array $content = array(),$module = '')
    {
        #$level = SEASLOG_WARNING
    }


    /**
     * 记录error日志
     * @param $message
     * @param array $content
     * @param string $module
     */
    static public function error($message,array $content = array(),$module = '')
    {
        #$level = SEASLOG_ERROR
    }


    /**
     * 记录critical日志
     * @param $message
     * @param array $content
     * @param string $module
     */
    static public function critical($message,array $content = array(),$module = '')
    {
        #$level = SEASLOG_CRITICAL
    }


    /**
     * 记录alert日志
     * @param $message
     * @param array $content
     * @param string $module
     */
    static public function alert($message,array $content = array(),$module = '')
    {
        #$level = SEASLOG_ALERT
    }


    /**
     * 记录emergency日志
     * @param $message
     * @param array $content
     * @param string $module
     */
    static public function emergency($message,array $content = array(),$module = '')
    {
        #$level = SEASLOG_EMERGENCY
    }


    /**
     * 通用日志方法
     * @param $level
     * @param $message
     * @param array $content
     * @param string $module
     */
    static public function log($level,$message,array $content = array(),$module = '')
    {


    }
}

SeasLog Logger的使用(详细文书档案)

利用SeasLog举行不奇怪预先警告

预先警告的配备

[base]
wait_analyz_log_path = /log/base_test


[fork]
;是否开启多线程 1开启 0关闭
fork_open = 1


;线程个数
fork_count = 3


[warning]
email[smtp_host] = smtp.163.com
email[smtp_port] = 25
email[subject_pre] = 预警邮件 -
email[smtp_user] = seaslogdemo@163.com
email[smtp_pwd] = seaslog#demo
email[mail_from] = seaslogdemo@163.com
email[mail_to] = gaochitao@weiboyi.com
email[mail_cc] = ciogao@gmail.com
email[mail_bcc] =


[analyz]
; enum
; SEASLOG_DEBUG      "debug"
; SEASLOG_INFO       "info"
; SEASLOG_NOTICE     "notice"
; SEASLOG_WARNING    "warning"
; SEASLOG_ERROR      "error"
; SEASLOG_CRITICAL   "critical"
; SEASLOG_ALERT      "alert"
; SEASLOG_EMERGENCY  "emergency"


test1[module] = test/bb
test1[level] = SEASLOG_ERROR
test1[bar] = 1
test1[mail_to] = gaochitao@weiboyi.com


test2[module] = 222
test2[level] = SEASLOG_WARNING


test3[module] = 333
test3[level] = SEASLOG_CRITICAL


test4[module] = 444
test4[level] = SEASLOG_EMERGENCY


test5[module] = 555
test5[level] = SEASLOG_DEBUG

crontab配置

;每天凌晨3点执行
0 3 * * * /path/to/php /path/to/SeasLog/Analyzer/SeasLogAnalyzer.php

Demo:

<?php
/**
 * @author ciogao@gmail.com
 * Date: 14-1-27 下午4:41
 */

echo '<pre>';
var_dump(SEASLOG_TYPE_INFO,SEASLOG_TYPE_INFO_STR);
var_dump(SEASLOG_TYPE_WARN,SEASLOG_TYPE_WARN_STR);
var_dump(SEASLOG_TYPE_ERRO,SEASLOG_TYPE_ERRO_STR);


var_dump(seaslog_get_basepath());
var_dump(seaslog_get_lastlogger());
var_dump(seaslog_get_basepath());
var_dump(seaslog('test info'));
var_dump(seaslog('test warning', SEASLOG_TYPE_WARN));
var_dump(seaslog('test error', SEASLOG_TYPE_ERRO));


var_dump(seaslog_set_basepath('/log/base_test'));
var_dump(seaslog_set_logger('testModule/app1'));
var_dump(seaslog('test info 2'));
var_dump(seaslog('test warning 2', SEASLOG_TYPE_WARN));
var_dump(seaslog('test error 2', SEASLOG_TYPE_ERRO));
var_dump(seaslog_get_basepath());
var_dump(seaslog_get_lastlogger());
var_dump(seaslog_get_basepath());

var_dump(seaslog('test error 3', SEASLOG_TYPE_ERRO, 'test/bb'));

var_dump(seaslog_analyzer_count()); // == seaslog_analyzer_count(ALL_TYPE);
var_dump(seaslog_analyzer_count(SEASLOG_TYPE_ERRO)); // == seaslog_analyzer_count(SEASLOG_TYPE_ERRO,'*')
var_dump(seaslog_analyzer_count(SEASLOG_TYPE_ERRO,'20140211.log'));


var_dump(seaslog_analyzer_detail(SEASLOG_TYPE_ERRO)); // == seaslog_analyzer_detail(SEASLOG_TYPE_ERRO,'*')
var_dump(seaslog_analyzer_detail(SEASLOG_TYPE_ERRO,'20140211.log'));


echo "n";

简介

对象是如何的

  • 便捷、规范的log记录

  • 非常的慢的海量log深入分析

  • 可配备、多门路的log预先警告

对象是怎样的
  • 便捷、规范的log记录
  • 飞速的海量log剖析
  • 可布署、多渠道的log预先警告

SeasLog
Yet a log extension for PHP.A effective,fast,stable log extension for PHP
@author Chitao.Gao [neeke@php.net]

编写翻译安装 SeasLog
$ 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

安装

SEASLOG_CRITICAL
  • "CCRUISERITICAL" - 热切意况、须要马上举办修复、程序组件不可用

技术员必上的开采者服务平台 —— DevStore

SEASLOG_EMERGENCY
  • "EME冠道GENCY" - 系统不可用
var_dump(SEASLOG_DEBUG,SEASLOG_INFO,SEASLOG_NOTICE);
/*
string('DEBUG') debug级别
string('INFO')  info级别
string('NOTICE') notice级别
*/

怎么使用SeasLog

log日志,经常是系统或软件、应用的周转记录。通过log的剖析,能够方便客户掌握系统或软件、应用的运营景况;假使您的行使log丰盛丰硕,也足以深入分析过去客户的操作行为、类型喜好、地域布满或其余越来越多消息;假设三个用到的log同临时候也分了四个等第,那么能够很随意地解析获得该使用的健康情状,及时开掘难题并快捷牢固、化解难题,补救损失。

php内置error_log、syslog函数成效庞大且品质极好,但鉴于各样弱点(error_log无不当等级、无固定格式,syslog不分模块、与系统日志混合),灵活度裁减了无数,不可能满足使用要求。

好音讯是,有好多第三方的log类库弥补了上述缺欠,如log4php、plog、Analog等(当然也可以有过多使用在项目中友好付出的log类)。当中以log4php极致显赫,设计精美、格式完美、文档完善、功用强大。推荐。(log4php的性质有待测量试验)

那便是说有未有一种log类库满意以下须求吗:

  • 分模块、分级别

  • 布局简单(最佳是勿须配备)

  • 日志格式清晰易读

  • 行使轻巧、品质很棒

SeasLog 正是应此必要而生。

近来提供了哪些

  • 在PHP项目中便捷、标准地记录log

  • 可配备的默许log目录与模块

  • 点名log目录与收获当前安顿

  • 始发的深入分析预先警告框架

  • 高速的日记缓冲、便捷的缓冲debug

  • 遵守 PS昂Cora-3 日志接口标准

SEASLOG_ALERT
  • "ALERT" - 必级立刻选用行动的急切事件、需求立即通报有关人口火急修复
预先警告的铺排
[base]
wait_analyz_log_path = /log/base_test

[fork]
;是否开启多线程 1开启 0关闭
fork_open = 1

;线程个数
fork_count = 3

[warning]
email[smtp_host] = smtp.163.com
email[smtp_port] = 25
email[subject_pre] = 预警邮件 -
email[smtp_user] = seaslogdemo@163.com
email[smtp_pwd] = seaslog#demo
email[mail_from] = seaslogdemo@163.com
email[mail_to] = gaochitao@weiboyi.com
email[mail_cc] = ciogao@gmail.com
email[mail_bcc] =

[analyz]
; enum
; SEASLOG_DEBUG      "DEBUG"
; SEASLOG_INFO       "INFO"
; SEASLOG_NOTICE     "NOTICE"
; SEASLOG_WARNING    "WARNING"
; SEASLOG_ERROR      "ERROR"
; SEASLOG_CRITICAL   "CRITICAL"
; SEASLOG_ALERT      "ALERT"
; SEASLOG_EMERGENCY  "EMERGENCY"

test1[module] = test/bb
test1[level] = SEASLOG_ERROR
test1[bar] = 1
test1[mail_to] = gaochitao@weiboyi.com

test2[module] = 222
test2[level] = SEASLOG_WARNING

test3[module] = 333
test3[level] = SEASLOG_CRITICAL

test4[module] = 444
test4[level] = SEASLOG_EMERGENCY

test5[module] = 555
test5[level] = SEASLOG_DEBUG
当seaslog.appender配置为 2(TCP) 或 3(UDP) 时,日志将推送至remote_host:remote_port的TCP或UDP端口

SeasLog发送至远端时,服从规范RFC5424
log格式统一为:
<PRI>1 {timeStampWithRFC3339} {HostName} {loggerName}[{pid}]: {logInfo}
上述{logInfo}
受配置 seaslog.default_template影响。

发送出去的格式如:
<15>1 2017-08-27T01:24:59 08:00 vagrant-ubuntu-trusty test/logger[27171]: 2016-06-25 00:59:43 | DEBUG | 21423 | 599157af4e937 | 1466787583.322 | this is a neeke debug
<14>1 2017-08-27T01:24:59 08:00 vagrant-ubuntu-trusty test/logger[27171]: 2016-06-25 00:59:43 | INFO | 21423 | 599157af4e937 | 1466787583.323 | this is a info log
<13>1 2017-08-27T01:24:59 08:00 vagrant-ubuntu-trusty test/logger[27171]: 2016-06-25 00:59:43 | NOTICE | 21423 | 599157af4e937 | 1466787583.324 | this is a notice log
时下提供了怎么着
  • 在PHP项目中便捷、标准地记录log
  • 可布署的暗中同意log目录与模块
  • 点名log目录与收获当前布局
  • 始发的深入分析预先警告框架
  • 火速的日记缓冲、便捷的缓冲debug
  • 遵循 PSR-3 日志接口标准
  • 自动记录错误音讯
  • 自动记录非凡音讯
  • 连日来TCP端口,以奥迪Q7FC5424格式发送日志
  • 连接UDP端口,以EvoqueFC5424格式发送日志
  • 扶助RequestId区分央求
  • 援救日志模板自定义
获得某项目log列表

SeasLog在扩大中央银行使管道调用shell命令 grep -w神速地获取列表,并赶回array给PHP。

$detailErrorArray_inAll   = SeasLog::analyzerDetail(SEASLOG_ERROR);
$detailErrorArray_today   = SeasLog::analyzerDetail(SEASLOG_ERROR,date('Ymd',time()));

var_dump($detailErrorArray_inAll,$detailErrorArray_today);

/*
SeasLog::analyzerDetail(SEASLOG_ERROR) == SeasLog::analyzerDetail(SEASLOG_ERROR,'*');
取当前模块下所有level为 SEASLOG_ERROR 的信息列表:
array(6) {
 [0] =>
  string(66) "2014-02-24 00:14:02 | ERROR | 8568 | 599157af4e937 | 1393172042.717 | test error 3 "
  [1] =>
  string(66) "2014-02-24 00:14:04 | ERROR | 8594 | 5991576584446 | 1393172044.104 | test error 3 "
  [2] =>
  string(66) "2014-02-24 00:14:04 | ERROR | 8620 | 1502697015147 | 1393172044.862 | test error 3 "
  [3] =>
  string(66) "2014-02-24 00:14:05 | ERROR | 8646 | 599159975a9ff | 1393172045.989 | test error 3 "
  [4] =>
  string(66) "2014-02-24 00:14:07 | ERROR | 8672 | 599159986ec28 | 1393172047.882 | test error 3 "
  [5] =>
  string(66) "2014-02-24 00:14:08 | ERROR | 8698 | 5991599981cec | 1393172048.736 | test error 3 "
}
SeasLog::analyzerDetail(SEASLOG_ERROR,date('Ymd',time()));
只取得当前模块下,当前一天内,level为SEASLOG_ERROR 的信息列表:
array(2) {
  [0] =>
  string(66) "2014-02-24 00:14:02 | ERROR | 8568 | 599157af4e937 | 1393172042.717 | test error 3 "
  [1] =>
  string(66) "2014-02-24 00:14:04 | ERROR | 8594 | 5991576584446 | 1393172044.104 | test error 3 "
}
同理,取当月
$detailErrorArray_mouth = SeasLog::analyzerDetail(SEASLOG_ERROR,date('Ym',time()));
*/
应用SeasLog举办常规预先警告
赢得与安装basePath
$basePath_1 = SeasLog::getBasePath();

SeasLog::setBasePath('/log/base_test');
$basePath_2 = SeasLog::getBasePath();

var_dump($basePath_1,$basePath_2);

/*
string(19) "/log/seaslog-ciogao"
string(14) "/log/base_test"
*/

直白动用 SeasLog::getBasePath(),将猎取php.ini(seaslog.ini)中装置的seaslog.default_basepath 的值。

使用 SeasLog::setBasePath() 函数,将改变 SeasLog::getBasePath() 的取值。

安装

自定义日志模版变量表

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。
  • %PRADO - Request ULX570I 央求UENVISIONI,如/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。
敏捷写入log

地点已经设置过了basePath与logger,于是log记录的目录已经发生了,

log记录目录 = basePath / logger / {fileName}.log log文件名,以 年月日 分文件,前段时间天是二零一六年0二月十十四日期,那么 {fileName} = 贰零壹肆0218;

还记得 php.ini 中安装的 seaslog.disting_type 吗?
默认的 seaslog.disting_type = 0,假若前几马来西亚人利用了 SeasLog ,那么将产生最后的log文件:

  • LogFile = basePath / logger / 20140218.log 如果 seaslog.disting_type = 1,则最终的log文件将是如此的多少个公文
  • infoLogFile = basePath / logger / 20140218.INFO.log
  • warnLogFile = basePath / logger / 20140218.WARNING.log
  • erroLogFile = basePath / logger / 20140218.ERROR.log
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'));

/*
这些函数同时也接受第3个参数为logger的设置项
注意,当last_logger == 'default'时等同于:
SeasLog::setLogger('test/new/path');
SeasLog::error('test error 3');
如果已经在前文使用过SeasLog::setLogger()函数,第3个参数的log只在此处临时使用,不影响下文。
*/

log格式受seaslog.default_template影响。 seaslog.default_template暗许模板为 seaslog.default_template = "%T | %L | %P | %Q | %t | %M" 那么在私下认可景况下,日志格式为:
{dateTime} | {level} | {pid} | {uniqid} | {timeStamp} | {logInfo}
有关自定义模板,及SeasLog中的预置值,可参谋
自定义日志模板

2014-07-27 08:53:52 | ERROR | 23625 | 599159975a9ff | 1406422432.786 | this is a error test by log
2014-07-27 08:53:52 | DEBUG | 23625 | 599159975a9ff | 1406422432.786 | this is a neeke debug
2014-07-27 08:53:52 | INFO | 23625 | 599159975a9ff | 1406422432.787 | this is a info log
2014-07-27 08:53:52 | NOTICE | 23625 | 599159975a9ff | 1406422432.787 | this is a notice log
2014-07-27 08:53:52 | WARNING | 23625 | 599159975a9ff | 1406422432.787 | your github.com was down,please rboot it ASAP!
2014-07-27 08:53:52 | ERROR | 23625 | 599159975a9ff | 1406422432.787 | a error log
2014-07-27 08:53:52 | CRITICAL | 23625 | 599159975a9ff | 1406422432.787 | some thing was critical
2014-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_DEBUG
  • "DEBUG" - debug音讯、细粒度音讯事件
急速总结某项目log的count值

SeasLog在扩张中应用管道调用shell命令 grep -wc快捷地赢得count值,并重返值(array || int)给PHP。

$countResult_1 = SeasLog::analyzerCount();
$countResult_2 = SeasLog::analyzerCount(SEASLOG_WARNING);
$countResult_3 = SeasLog::analyzerCount(SEASLOG_ERROR,date('Ymd',time()));

var_dump($countResult_1,$countResult_2,$countResult_3);
/*
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.ini的配置
[SeasLog]
;configuration for php SeasLog module
extension = seaslog.so

;默认log根目录
seaslog.default_basepath = "/var/log/www"

;默认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 = 1

;是否每小时划分一个文件 1是 0否(默认)
seaslog.disting_by_hour = 0

;是否启用buffer 1是 0否(默认)
seaslog.use_buffer = 0

;buffer中缓冲数量 默认0(不使用buffer_size)
seaslog.buffer_size = 100

;记录日志级别,数字越大,根据级别记的日志越多。
;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
  • seaslog.disting_type = 1 敞开以type分文件,即log文件分别infowarnerro
  • seaslog.disting_by_hour = 1 开启每时辰划分一个文书
  • seaslog.use_buffer = 1 展开buffer。暗中认可关闭。当展开此项时,日志预存于内部存款和储蓄器,当呼吁截止时(或特别退出时)二遍写入文件。
  • seaslog.buffer_size = 100 设置缓冲数量为100. 默认为0,即无缓冲数量限制.当buffer_size大于0时,缓冲量达到该值则写一回文件.
  • 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。
  • seaslog.throw_exception = 1 开启抛出SeasLog抛出自己的那些。当出现录权限或收取服务器端口不通等气象时,抛出非常;关闭时不抛出拾壹分。
  • seaslog.ignore_warning = 1 开启忽略SeasLog自己的警示。当出现目录权限或接受服务器端口不通等状态时,将开展忽略;关闭时,将抛出警示。
SEASLOG_WARNING
  • "WALacrosseNING" - 出现了非错误性的丰富消息、潜在十分消息、要求关爱并且需求修补
SeasLog Logger的使用
crontab配置
;每天凌晨3点执行
0 3 * * * /path/to/php /path/to/SeasLog/Analyzer/SeasLogAnalyzer.php
日志模板表明
  • 模板默以为:seaslog.default_template = "%T | %L | %P | %Q | %t | %M",意味着,暗中同意的格式为{dateTime} | {level} | {pid} | {uniqid} | {timeStamp} | {logInfo}
  • 即使自定义的格式为:seaslog.default_template = "[%T]:%L %P %Q %t %M"
    这便是说,日志格式将被自定义为:[{dateTime}]:{level} {pid} {uniqid} {timeStamp} {logInfo}
    留心:%L 必需在%M在此之前,即:日志品级,必需在日记内容前面。
设置logger与获取lastLogger
$lastLogger_1 = SeasLog::getLastLogger();

SeasLog::setLogger('testModule/app1');
$lastLogger_2 = SeasLog::getLastLogger();

var_dump($lastLogger_1,$lastLogger_2);
/*
string(7) "default"
string(15) "testModule/app1"
*/
  • 与basePath相类似的,
  • 一向接纳SeasLog::getLastLogger(),将得到php.ini(seaslog.ini)中安装的seaslog.default_logger的值。
  • 使用 SeasLog::setLogger() 函数,将改变 SeasLog::getLastLogger()的取值。
自定义日志模板

非常多相爱的人在应用进程中涉嫌自定义日志模板的供给,于是自1.7.2本子早先,具有了那些力量,允许客户自定义日志的模板, 同期在模板中得以行使预置的数不清预设变量,参照预设变量表。

常量列表

SeasLog 共将日志分成8个级别

使用

PHP Re 结果
/usr/local/php/php-7.0.6-zts-debug/bin/php --re seaslog

Extension [ <persistent> extension #32 SeasLog version 1.6.9 ] {

  - Dependencies {
  }

  - INI {
    Entry [ seaslog.default_basepath <ALL> ]
      Current = '/var/log/www'
    }
    Entry [ seaslog.default_logger <ALL> ]
      Current = 'defauult'
    }
    Entry [ seaslog.default_datetime_format <ALL> ]
      Current = 'Y-m-d H:i:s'
    }
    Entry [ seaslog.default_template <ALL> ]
      Current = '%L | %P | %Q | %t | %T | %M'
    }
    Entry [ seaslog.disting_type <ALL> ]
      Current = '0'
    }
    Entry [ seaslog.disting_by_hour <ALL> ]
      Current = '0'
    }
    Entry [ seaslog.use_buffer <ALL> ]
      Current = '1'
    }
    Entry [ seaslog.trace_error <ALL> ]
      Current = '1'
    }
    Entry [ seaslog.trace_exception <ALL> ]
      Current = '1'
    }
    Entry [ seaslog.buffer_size <ALL> ]
      Current = '10'
    }
    Entry [ seaslog.level <ALL> ]
      Current = '0'
    }
    Entry [ seaslog.appender <ALL> ]
      Current = '1'
    }
    Entry [ seaslog.remote_host <ALL> ]
      Current = '127.0.0.1'
    }
    Entry [ seaslog.remote_port <ALL> ]
      Current = '514'
    }
    Entry [ seaslog.trim_wrap <ALL> ]
      Current = '0'
    }
    Entry [ seaslog.throw_exception <ALL> ]
      Current = '1'
    }
    Entry [ seaslog.ignore_warning <ALL> ]
      Current = '1'
    }
  }

  - Constants [16] {
    Constant [ string SEASLOG_VERSION ] { 1.7.5 }
    Constant [ string SEASLOG_AUTHOR ] { Chitao.Gao  [ neeke@php.net ] }
    Constant [ string SEASLOG_ALL ] { ALL }
    Constant [ string SEASLOG_DEBUG ] { DEBUG }
    Constant [ string SEASLOG_INFO ] { INFO }
    Constant [ string SEASLOG_NOTICE ] { NOTICE }
    Constant [ string SEASLOG_WARNING ] { WARNING }
    Constant [ string SEASLOG_ERROR ] { ERROR }
    Constant [ string SEASLOG_CRITICAL ] { CRITICAL }
    Constant [ string SEASLOG_ALERT ] { ALERT }
    Constant [ string SEASLOG_EMERGENCY ] { EMERGENCY }
    Constant [ integer SEASLOG_DETAIL_ORDER_ASC ] { 1 }
    Constant [ integer SEASLOG_DETAIL_ORDER_DESC ] { 2 }
    Constant [ integer SEASLOG_APPENDER_FILE ] { 1 }
    Constant [ integer SEASLOG_APPENDER_TCP ] { 2 }
    Constant [ integer SEASLOG_APPENDER_UDP ] { 3 }
  }

  - Functions {
    Function [ <internal:SeasLog> function seaslog_get_version ] {
    }
    Function [ <internal:SeasLog> function seaslog_get_author ] {
    }
  }

  - Classes [1] {
    Class [ <internal:SeasLog> class SeasLog ] {

      - Constants [0] {
      }

      - Static properties [0] {
      }

      - Static methods [19] {
        Method [ <internal:SeasLog> static public method setBasePath ] {

          - Parameters [1] {
            Parameter #0 [ <required> $base_path ]
          }
        }

        Method [ <internal:SeasLog> static public method getBasePath ] {
        }

        Method [ <internal:SeasLog> static public method setLogger ] {

          - Parameters [1] {
            Parameter #0 [ <required> $logger ]
          }
        }

        Method [ <internal:SeasLog> static public method getLastLogger ] {
        }

        Method [ <internal:SeasLog> static public method setRequestID ] {

          - Parameters [1] {
            Parameter #0 [ <required> $request_id ]
          }
        }

        Method [ <internal:SeasLog> static public method getRequestID ] {
        }

        Method [ <internal:SeasLog> static public method setDatetimeFormat ] {

          - Parameters [1] {
            Parameter #0 [ <required> $format ]
          }
        }

        Method [ <internal:SeasLog> static public method getDatetimeFormat ] {
        }

        Method [ <internal:SeasLog> static public method analyzerCount ] {

          - Parameters [3] {
            Parameter #0 [ <required> $level ]
            Parameter #1 [ <optional> $log_path ]
            Parameter #2 [ <optional> $key_word ]
          }
        }

        Method [ <internal:SeasLog> static public method analyzerDetail ] {

          - Parameters [6] {
            Parameter #0 [ <required> $level ]
            Parameter #1 [ <optional> $log_path ]
            Parameter #2 [ <optional> $key_word ]
            Parameter #3 [ <optional> $start ]
            Parameter #4 [ <optional> $limit ]
            Parameter #5 [ <optional> $order ]
          }
        }

        Method [ <internal:SeasLog> static public method getBuffer ] {
        }

        Method [ <internal:SeasLog> static public method flushBuffer ] {
        }

        Method [ <internal:SeasLog> static public method log ] {

          - Parameters [4] {
            Parameter #0 [ <required> $level ]
            Parameter #1 [ <optional> $message ]
            Parameter #2 [ <optional> $content ]
            Parameter #3 [ <optional> $logger ]
          }
        }

        Method [ <internal:SeasLog> static public method debug ] {

          - Parameters [3] {
            Parameter #0 [ <required> $message ]
            Parameter #1 [ <optional> $content ]
            Parameter #2 [ <optional> $logger ]
          }
        }

        Method [ <internal:SeasLog> static public method info ] {

          - Parameters [3] {
            Parameter #0 [ <required> $message ]
            Parameter #1 [ <optional> $content ]
            Parameter #2 [ <optional> $logger ]
          }
        }

        Method [ <internal:SeasLog> static public method notice ] {

          - Parameters [3] {
            Parameter #0 [ <required> $message ]
            Parameter #1 [ <optional> $content ]
            Parameter #2 [ <optional> $logger ]
          }
        }

        Method [ <internal:SeasLog> static public method warning ] {

          - Parameters [3] {
            Parameter #0 [ <required> $message ]
            Parameter #1 [ <optional> $content ]
            Parameter #2 [ <optional> $logger ]
          }
        }

        Method [ <internal:SeasLog> static public method error ] {

          - Parameters [3] {
            Parameter #0 [ <required> $message ]
            Parameter #1 [ <optional> $content ]
            Parameter #2 [ <optional> $logger ]
          }
        }

        Method [ <internal:SeasLog> static public method critical ] {

          - Parameters [3] {
            Parameter #0 [ <required> $message ]
            Parameter #1 [ <optional> $content ]
            Parameter #2 [ <optional> $logger ]
          }
        }

        Method [ <internal:SeasLog> static public method alert ] {

          - Parameters [3] {
            Parameter #0 [ <required> $message ]
            Parameter #1 [ <optional> $content ]
            Parameter #2 [ <optional> $logger ]
          }
        }

        Method [ <internal:SeasLog> static public method emergency ] {

          - Parameters [3] {
            Parameter #0 [ <required> $message ]
            Parameter #1 [ <optional> $content ]
            Parameter #2 [ <optional> $logger ]
          }
        }
      }

      - Properties [0] {
      }

      - Methods [2] {
        Method [ <internal:SeasLog, ctor> public method __construct ] {
        }

        Method [ <internal:SeasLog, dtor> public method __destruct ] {
        }
      }
    }
  }
}
SEASLOG_NOTICE
  • "NOTICE" - 一般主要事件、试行进程中较INFO等级更为主要的新闻
缘何接纳SeasLog
  • log日志,平常是系统或软件、应用的运作记录。通过log的深入分析,能够低价客商领会系统或软件、应用的运维状态;假如你的应用log丰硕丰硕,也能够分析过去客商的操作行为、类型喜好、地域遍布或任何越来越多音讯;若是八个利用的log同有时候也分了多少个等级,那么可以很自由地深入分析得到该行使的健康情形,及时开采难题并极快稳固、消除难题,补救损失。

  • php内置error_log、syslog函数功用庞大且品质极好,但出于种种缺点(error_log无不当等级、无固定格式,syslog不分模块、与系统日志混合),灵活度收缩了大多,无法满意使用须求。

  • 好音讯是,有那些第三方的log类库弥补了上述缺欠,如log4php、plog、Analog等(当然也可能有数不清施用在类型中和煦支付的log类)。在那之中以log4php极端著名,设计精良、格式完美、文书档案完善、作用庞大。推荐。

  • 但是log4php在质量方面表现非常倒霉,下图是SeasLog与log4php的ab并发性能测量试验( 测量试验意况:Ubuntu12.04单机,CPU I3,内存 16G,硬盘 SATA 7200):

彩世界网址 3

SeasLogVSlog4php.png

那就是说有未有一种log类库满足以下要求吗:

  • 分模块、分级别
  • 安顿简单(最佳是勿须配备)
  • 日志格式清晰易读
  • 动用轻松、品质很棒

SeasLog 便是应此要求而生。

SeasLog Analyzer的使用
SEASLOG_ERROR
  • "E揽胜ROLAND" - 运转时出现的不当、不须求及时进行修复、不影响整个逻辑的运作、须要记录并做检查实验
函数列表

SeasLog 提供了那样一组函数,能够方便地赢得与安装根目录、模块目录、急忙写入与总结log。 相信从下述伪代码的笺注中,您能够连忙获得函数新闻,具体采纳将紧接其后:

<?php
/**
 * @author neeke@php.net
 * Date: 14-1-27 下午4:47
 */
define('SEASLOG_ALL', 'ALL');
define('SEASLOG_DEBUG', 'DEBUG');
define('SEASLOG_INFO', 'INFO');
define('SEASLOG_NOTICE', 'NOTICE');
define('SEASLOG_WARNING', 'WARNING');
define('SEASLOG_ERROR', 'ERROR');
define('SEASLOG_CRITICAL', 'CRITICAL');
define('SEASLOG_ALERT', 'ALERT');
define('SEASLOG_EMERGENCY', 'EMERGENCY');
define('SEASLOG_DETAIL_ORDER_ASC', 1);
define('SEASLOG_DETAIL_ORDER_DESC', 2);

class SeasLog
{
    public function __construct()
    {
        #SeasLog init
    }

    public function __destruct()
    {
        #SeasLog distroy
    }

    /**
     * 设置basePath
     *
     * @param $basePath
     *
     * @return bool
     */
    static public function setBasePath($basePath)
    {
        return TRUE;
    }

    /**
     * 获取basePath
     *
     * @return string
     */
    static public function getBasePath()
    {
        return 'the base_path';
    }

    /**
     * 设置本次请求标识
     * @param string
     * @return bool
     */
    static public function setRequestID($request_id){
        return TRUE;
    }
    /**
     * 获取本次请求标识
     * @return string
     */
    static public function getRequestID(){
        return uniqid();
    }

    /**
     * 设置模块目录
     * @param $module
     *
     * @return bool
     */
    static public function setLogger($module)
    {
        return TRUE;
    }

    /**
     * 获取最后一次设置的模块目录
     * @return string
     */
    static public function getLastLogger()
    {
        return 'the lastLogger';
    }

    /**
     * 设置DatetimeFormat配置
     * @param $format
     *
     * @return bool
     */
    static public function setDatetimeFormat($format)
    {
        return TRUE;
    }

    /**
     * 返回当前DatetimeFormat配置格式
     * @return string
     */
    static public function getDatetimeFormat()
    {
        return 'the datetimeFormat';
    }

    /**
     * 统计所有类型(或单个类型)行数
     * @param string $level
     * @param string $log_path
     * @param null   $key_word
     *
     * @return array | long
     */
    static public function analyzerCount($level = 'all', $log_path = '*', $key_word = NULL)
    {
        return array();
    }

    /**
     * 以数组形式,快速取出某类型log的各行详情
     *
     * @param        $level
     * @param string $log_path
     * @param null   $key_word
     * @param int    $start
     * @param int    $limit
     * @param        $order 默认为正序 SEASLOG_DETAIL_ORDER_ASC,可选倒序 SEASLOG_DETAIL_ORDER_DESC
     *
     * @return array
     */
    static public function analyzerDetail($level = SEASLOG_INFO, $log_path = '*', $key_word = NULL, $start = 1, $limit = 20, $order = SEASLOG_DETAIL_ORDER_ASC)
    {
        return array();
    }

    /**
     * 获得当前日志buffer中的内容
     *
     * @return array
     */
    static public function getBuffer()
    {
        return array();
    }

    /**
     * 将buffer中的日志立刻刷到硬盘
     *
     * @return bool
     */
    static public function flushBuffer()
    {
        return TRUE;
    }

    /**
     * 记录debug日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function debug($message, array $content = array(), $module = '')
    {
        #$level = SEASLOG_DEBUG
    }

    /**
     * 记录info日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function info($message, array $content = array(), $module = '')
    {
        #$level = SEASLOG_INFO
    }

    /**
     * 记录notice日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function notice($message, array $content = array(), $module = '')
    {
        #$level = SEASLOG_NOTICE
    }

    /**
     * 记录warning日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function warning($message, array $content = array(), $module = '')
    {
        #$level = SEASLOG_WARNING
    }

    /**
     * 记录error日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function error($message, array $content = array(), $module = '')
    {
        #$level = SEASLOG_ERROR
    }

    /**
     * 记录critical日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function critical($message, array $content = array(), $module = '')
    {
        #$level = SEASLOG_CRITICAL
    }

    /**
     * 记录alert日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function alert($message, array $content = array(), $module = '')
    {
        #$level = SEASLOG_ALERT
    }

    /**
     * 记录emergency日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function emergency($message, array $content = array(), $module = '')
    {
        #$level = SEASLOG_EMERGENCY
    }

    /**
     * 通用日志方法
     * @param        $level
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function log($level, $message, array $content = array(), $module = '')
    {

    }
}
常量与函数

本文由时时app平台注册网站发布于彩世界网址,转载请注明出处:使用SeasLog打造PHP项目中的高性能日志组件(1)彩世

关键词: