log日志都是架构中不可缺少的一个重要组成部分

2019-11-03 22:12栏目:www.88pt88.com
TAG:

运用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的性质非常糟糕。

大奖888官网 1

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

兼备思路

那么有未有风度翩翩种log类库同期满足以下要求吗:

●分模块、分级别

●配置轻巧(最棒是勿须配备)

●日志格式清晰易读

●应用轻巧、品质很棒

大奖888官网,大家知晓,PS奥迪Q7-3规范是叁个国际化的日志规范,它须求了“模块、品级、清晰、易用”等日志工作应具备的特色。由此,只要大家依照了PS帕杰罗-3规范,则大家能够变成“分模块、分品级”以致“日志格式清晰易读”的渴求。

“配置轻便”那些须要也很好完毕。假设严俊根据既定法规,其实只供给安装暗中认可目录就能够了。

OK,今后大家只剩余“品质”那二个渴求。

既是是日记,免不了会写文件,可能通过pipe通过互连网传送到有个别存款和储蓄宗旨(咱们暂不思考存款和储蓄中央的铺排性)。可以推测,假使叁个伸手中需求写出1000处log,那么势必会有1000次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

●据守 PS宝马X3-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时,全数日志均不记录。


大奖888官网 2


) 什么是SeasLog SeasLog是一个C语言编写的PHP扩大,提供生龙活虎组正式规范的功效函数,在PHP项目中方便...

技士必上的开拓者服务平台 —— DevStore

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

为啥使用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

  • 依照 PSXC90-3 日志接口标准

对象是怎样的

  • 便捷、规范的log记录

  • 快快的海量log深入分析

  • 可配备、多路子的log预先警示

安装

编写翻译安装 seaslog

$ /path/to/phpize
$ ./configure --with-php-config=/path/to/php-config
$ make && make install

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";

版权声明:本文由大奖888-www.88pt88.com-大奖888官网登录发布于www.88pt88.com,转载请注明出处:log日志都是架构中不可缺少的一个重要组成部分