PHP日志擴(kuò)展SeasLog-1.6.0,支持TCP,UDP發(fā)送
SeasLog-1.6.0 發(fā)布,支持TCP,UDP發(fā)送,輕量高效的PHP日志擴(kuò)展。
改進(jìn)日志:
此次改進(jìn)支持appender配置,同時(shí)支持File,TCP,UDP三種發(fā)送方式。
- Fixed issue #90 #92 Date format.
- Fixed issue #96 Clear memory leaks.
- Fixed issue #91 Support TCP UDP appender.
- Support appender with config, switch File TCP UDP; config the remote_host and remote_port.
為什么使用SeasLog
log日志,通常是系統(tǒng)或軟件、應(yīng)用的運(yùn)行記錄。通過log的分析,可以方便用戶了解系統(tǒng)或軟件、應(yīng)用的運(yùn)行情況;如果你的應(yīng)用log足夠豐富,也可以分析以往用戶的操作行為、類型喜好、地域分布或其他更多信息;如果一個(gè)應(yīng)用的log同時(shí)也分了多個(gè)級(jí)別,那么可以很輕易地分析得到該應(yīng)用的健康狀況,及時(shí)發(fā)現(xiàn)問題并快速定位、解決問題,補(bǔ)救損失。
php內(nèi)置error_log、syslog函數(shù)功能強(qiáng)大且性能極好,但由于各種缺陷(error_log無錯(cuò)誤級(jí)別、無固定格式,syslog不分模塊、與系統(tǒng)日志混合),靈活度降低了很多,不能滿足應(yīng)用需求。
好消息是,有不少第三方的log類庫彌補(bǔ)了上述缺陷,如log4php、plog、Analog等(當(dāng)然也有很多應(yīng)用在項(xiàng)目中自己開發(fā)的log類)。其中以log4php最為著名,設(shè)計(jì)精良、格式完美、文檔完善、功能強(qiáng)大。推薦。
不過log4php在性能方面表現(xiàn)非常差,下圖是SeasLog與log4php的ab并發(fā)性能測(cè)試( 測(cè)試環(huán)境:Ubuntu12.04單機(jī),CPU I3,內(nèi)存 16G,硬盤 SATA 7200):
那么有沒有一種log類庫滿足以下需求呢:
分模塊、分級(jí)別
配置簡(jiǎn)單(最好是勿須配置)
日志格式清晰易讀
應(yīng)用簡(jiǎn)單、性能很棒
SeasLog?正是應(yīng)此需求而生。
目前提供了什么
在PHP項(xiàng)目中便捷、規(guī)范地記錄log
可配置的默認(rèn)log目錄與模塊
指定log目錄與獲取當(dāng)前配置
初步的分析預(yù)警框架
高效的日志緩沖、便捷的緩沖debug
遵循 PSR-3 日志接口規(guī)范
自動(dòng)記錄錯(cuò)誤信息
自動(dòng)記錄異常信息
支持TCP發(fā)送
支持UDP發(fā)立大
便捷、規(guī)范的log記錄
高效的海量log分析
可配置、多途徑的log預(yù)警
編譯安裝 SeasLog
$?/path/to/phpize
$?./configure?--with-php-config=/path/to/php-config
$?make?&&?make?install
PECL安裝SeasLog
$?pecl?install?seaslog
seaslog.ini 的配置
;?configuration?for?php?SeasLog?module
extension?=?seaslog.so
seaslog.default_basepath?=?/log/seaslog-test????????????;默認(rèn)log根目錄
seaslog.default_logger?=?default????????????????????????;默認(rèn)logger目錄
seaslog.disting_type?=?1????????????????????????????????;是否以type分文件?1是?0否(默認(rèn))
seaslog.disting_by_hour?=?1?????????????????????????????;是否每小時(shí)劃分一個(gè)文件?1是?0否(默認(rèn))
seaslog.use_buffer?=?1??????????????????????????????????;是否啟用buffer?1是?0否(默認(rèn))
seaslog.buffer_size?=?100???????????????????????????????;buffer中緩沖數(shù)量?默認(rèn)0(不使用buffer_size)
seaslog.level?=?0???????????????????????????????????????;記錄日志級(jí)別?默認(rèn)0(所有日志)
seaslog.trace_error?=?1?????????????????????????????????;自動(dòng)記錄錯(cuò)誤?默認(rèn)1(開啟)
seaslog.trace_exception?=?0?????????????????????????????;自動(dòng)記錄異常信息?默認(rèn)0(關(guān)閉)
seaslog.default_datetime_format?=?"Y:m:d?H:i:s"?????????;日期格式配置?默認(rèn)"Y:m:d?H:i:s"
seaslog.appender?=?1????????????????????????????????????;日志存儲(chǔ)介質(zhì)?1File?2TCP?3UDP?(默認(rèn)為1)
seaslog.remote_host?=?127.0.0.1?????????????????????????;接收ip?默認(rèn)127.0.0.1?(當(dāng)使用TCP或UDP時(shí)必填)
seaslog.remote_port?=?514???????????????????????????????;接收端口?默認(rèn)514?(當(dāng)使用TCP或UDP時(shí)必填)
seaslog.disting_type = 1 開啟以type分文件,即log文件區(qū)分info\warn\erro
seaslog.disting_by_hour = 1 開啟每小時(shí)劃分一個(gè)文件
seaslog.use_buffer = 1 開啟buffer。默認(rèn)關(guān)閉。當(dāng)開啟此項(xiàng)時(shí),日志預(yù)存于內(nèi)存,當(dāng)請(qǐng)求結(jié)束時(shí)(或異常退出時(shí))一次寫入文件。
常量與函數(shù)
常量列表
*?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級(jí)別
string('info')??info級(jí)別
string('notice')?notice級(jí)別
*/
函數(shù)列表
SeasLog 提供了這樣一組函數(shù),可以方便地獲取與設(shè)置根目錄、模塊目錄、快速寫入與統(tǒng)計(jì)log。 相信從下述偽代碼的注釋中,您可以快速獲取函數(shù)信息,具體使用將緊接其后:
/**
*?@author?neeke@php.net
*?Date:?14-1-27?下午4:47
*/
class?SeasLog
{
public?function?__construct()
{
#SeasLog?init
}
public?function?__destruct()
{
#SeasLog?distroy
}
/**
*?設(shè)置basePath
*
*?@param?$basePath
*
*?@return?bool
*/
static?public?function?setBasePath($basePath)
{
return?TRUE;
}
/**
*?獲取basePath
*
*?@return?string
*/
static?public?function?getBasePath()
{
return?'the?base_path';
}
/**
*?設(shè)置模塊目錄
*?@param?$module
*
*?@return?bool
*/
static?public?function?setLogger($module)
{
return?TRUE;
}
/**
*?獲取最后一次設(shè)置的模塊目錄
*?@return?string
*/
static?public?function?getLastLogger()
{
return?'the?lastLogger';
}
/**
*?設(shè)置DatetimeFormat配置
*?@param?$format
*
*?@return?bool
*/
static?public?function?setDatetimeFormat($format)
{
return?TRUE;
}
/**
*?返回當(dāng)前DatetimeFormat配置格式
*?@return?string
*/
static?public?function?getDatetimeFormat()
{
return?'the?datetimeFormat';
}
/**
*?統(tǒng)計(jì)所有類型(或單個(gè)類型)行數(shù)
*?@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();
}
/**
*?以數(shù)組形式,快速取出某類型log的各行詳情
*
*?@param????????$level
*?@param?string?$log_path
*?@param?null???$key_word
*?@param?int????$start
*?@param?int????$limit
*?@param????????$order
*
*?@return?array
*/
static?public?function?analyzerDetail($level?=?SEASLOG_INFO,?$log_path?=?'*',?$key_word?=?NULL,?$start?=?1,?$limit?=?20,?$order?=?SEASLOG_DETIAL_ORDER_ASC)
{
return?array();
}
/**
*?獲得當(dāng)前日志buffer中的內(nèi)容
*
*?@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?=?'')
{
}
}
使用SeasLog進(jìn)行健康預(yù)警
預(yù)警的配置
[base]
wait_analyz_log_path?=?/log/base_test
[fork]
;是否開啟多線程?1開啟?0關(guān)閉
fork_open?=?1
;線程個(gè)數(shù)
fork_count?=?3
[warning]
email[smtp_host]?=?smtp.163.com
email[smtp_port]?=?25
email[subject_pre]?=?預(yù)警郵件?-
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點(diǎn)執(zhí)行
0?3?*?*?*?/path/to/php?/path/to/SeasLog/Analyzer/SeasLogAnalyzer.php
Demo:
/**
*?@author?ciogao@gmail.com
*?Date:?14-1-27?下午4:41
*/
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'));
echo?"\n";