layout: post
title: "PHP高性能日志SeasLog"
date: 2016-04-29 09:59:55 +0800
comments: true
categories: [PHP]
PHP高性能日志SeasLog
一边灭、什么是SeasLog
SeasLog是一個(gè)C語(yǔ)言編寫的PHP擴(kuò)展挨摸,提供一組規(guī)范標(biāo)準(zhǔn)的功能函數(shù)厦酬,在PHP項(xiàng)目中方便、規(guī)范贫贝、高效地寫日志同窘,以及快速地讀取和查詢?nèi)罩尽?br>
二、為什么需要日志系統(tǒng)
- 了解系統(tǒng)運(yùn)行情況
- 記錄用戶操作信息
- 收集需要
三晨缴、為什么選擇SeasLog
- 高性能 帶有緩沖池功能。
- 無(wú)需配置
- 功能完善峡捡,使用簡(jiǎn)單
四击碗、SeasLog安裝
到[pecl](http://pecl.php.net/)搜索seaslog并下載
解壓后
可自行編譯。
$ cd seaslog //進(jìn)到解壓目錄
$ phpize
$ ./configure --with-php-config=/path/to/php-config //path to 為你的PHP安裝目錄
$ make && make install
當(dāng)然们拙,使用PECL管理工具會(huì)更方便:
$ 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(所有日志)
需要將這里面的數(shù)據(jù)寫到php.ini中去
seaslog.disting_type = 1 開(kāi)啟以type分文件稍途,即log文件區(qū)分info\warn\erro
seaslog.disting_by_hour = 1 開(kāi)啟每小時(shí)劃分一個(gè)文件
seaslog.use_buffer = 1 開(kāi)啟buffer。默認(rèn)關(guān)閉睛竣。當(dāng)開(kāi)啟此項(xiàng)時(shí)晰房,日志預(yù)存于內(nèi)存,當(dāng)請(qǐng)求結(jié)束時(shí)(或異常退出時(shí))一次寫入文件射沟。
seaslog.buffer_size = 100 設(shè)置緩沖數(shù)量為100. 默認(rèn)為0,即無(wú)緩沖數(shù)量限制.當(dāng)buffer_size大于0時(shí),緩沖量達(dá)到該值則寫一次文件.
seaslog.level = 3 記錄的日志級(jí)別.默認(rèn)為0,即所有日志均記錄。當(dāng)level為1時(shí),關(guān)注debug以上級(jí)別(包括debug)与境,以此類推验夯。level大于8時(shí),所有日志均不記錄摔刁。
默認(rèn)常量有哪些
遵循PSR-3標(biāo)準(zhǔn)挥转,SeasLog 共將日志分成8個(gè)級(jí)別
SEASLOG_DEBUG "debug"
SEASLOG_INFO "info"
SEASLOG_NOTICE "notice"
SEASLOG_WARNING "warning"
SEASLOG_ERROR "error"
SEASLOG_CRITICAL "critical"
SEASLOG_ALERT "alert"
SEASLOG_EMERGENCY "emergency"
都提供哪些方法
<?php
/**
* @author neeke@php.net 云智慧
*/
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';
}
/**
* 統(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
* @return array
*/
static public function analyzerDetail($level = SEASLOG_INFO,$log_path = '*',$key_word = NULL, $start = 1,$limit = 20)
{
return array();
}
/**
* 獲得當(dāng)前日志buffer中的內(nèi)容
* @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 = '')
{
}
}
在項(xiàng)目中如何使用
獲取與設(shè)置basePatn
/**
*靜態(tài)方法可以不實(shí)例化直接使用
*
*/
$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)中設(shè)置的seaslog.default_basepath 的值绑谣。
使用 SeasLog::getBasePath() 函數(shù)党窜,將改變 seaslog_get_basepath() 的取值。
設(shè)置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)中設(shè)置的seaslog.default_logger 的值。
使用 SeasLog::setLogger() 函數(shù)壤玫,將改變 SeasLog::getLastLogger() 的取值豁护。
SeasLog Logger的使用
獲取與設(shè)置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)中設(shè)置的 seaslog.default_basepath 的值欲间。
使用 SeasLog::setBasePath() 函數(shù)楚里,將改變 SeasLog::getBasePath() 的取值。
設(shè)置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)中設(shè)置的 seaslog.default_logger 的值。
使用 SeasLog::setLogger() 函數(shù)她渴,將改變 SeasLog::getLastLogger() 的取值达址。
快速寫入log
上面已經(jīng)設(shè)置過(guò)了basePath與logger,于是log記錄的目錄已經(jīng)產(chǎn)生了惹骂,
log記錄目錄 = basePath / logger / {fileName}.log log文件名苏携,以 年月日 分文件,如今天是2014年02月18日期对粪,那么 {fileName} = 20140218;
還記得 php.ini 中設(shè)置的 seaslog.disting_type 嗎右冻?
默認(rèn)的 seaslog.disting_type = 0,如果今天我使用了 SeasLog 著拭,那么將產(chǎn)生最終的log文件:
* LogFile = basePath / logger / 20140218.log
如果 seaslog.disting_type = 1纱扭,則最終的log文件將是這樣的三個(gè)文件
infoLogFile = basePath / logger / INFO.20140218.log
warnLogFile = basePath / logger / WARN.20140218.log
erroLogFile = basePath / logger / ERRO.20140218.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'));
/*
這些函數(shù)同時(shí)也接受第3個(gè)參數(shù)為logger的設(shè)置項(xiàng)
注意,當(dāng)last_logger == 'default'時(shí)等同于:
SeasLog::setLogger('test/new/path');
SeasLog::error('test error 3');
如果已經(jīng)在前文使用過(guò)SeasLog::setLogger()函數(shù)儡遮,第3個(gè)參數(shù)的log只在此處臨時(shí)使用乳蛾,不影響下文。
*/
log格式統(tǒng)一為: {type} | {pid} | {timeStamp} |{dateTime} | {logInfo}
error | 23625 | 1406422432.786 | 2014:07:27 08:53:52 | this is a error test by log
debug | 23625 | 1406422432.786 | 2014:07:27 08:53:52 | this is a neeke debug
info | 23625 | 1406422432.787 | 2014:07:27 08:53:52 | this is a info log
notice | 23625 | 1406422432.787 | 2014:07:27 08:53:52 | this is a notice log
warning | 23625 | 1406422432.787 | 2014:07:27 08:53:52 | your github.com was down,please rboot it ASAP!
error | 23625 | 1406422432.787 | 2014:07:27 08:53:52 | a error log
critical | 23625 | 1406422432.787 | 2014:07:27 08:53:52 | some thing was critical
emergency | 23625 | 1406422432.787 | 2014:07:27 08:53:52 | Just now, the house next door was completely burnt out! it is a joke
SeasLog Analyzer的使用
快速統(tǒng)計(jì)某類型log的count值
SeasLog在擴(kuò)展中使用管道調(diào)用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)
*/
獲取某類型log列表
SeasLog在擴(kuò)展中使用管道調(diào)用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,'*');
取當(dāng)前模塊下所有l(wèi)evel為 SEASLOG_ERROR 的信息列表:
array(6) {
[0] =>
string(66) "error | 8568 | 1393172042.717 | 2014:02:24 00:14:02 | test error 3 "
[1] =>
string(66) "error | 8594 | 1393172044.104 | 2014:02:24 00:14:04 | test error 3 "
[2] =>
string(66) "error | 8620 | 1393172044.862 | 2014:02:24 00:14:04 | test error 3 "
[3] =>
string(66) "error | 8646 | 1393172045.989 | 2014:02:24 00:14:05 | test error 3 "
[4] =>
string(66) "error | 8672 | 1393172047.882 | 2014:02:24 00:14:07 | test error 3 "
[5] =>
string(66) "error | 8698 | 1393172048.736 | 2014:02:24 00:14:08 | test error 3 "
}
SeasLog::analyzerDetail(SEASLOG_ERROR,date('Ymd',time()));
只取得當(dāng)前模塊下因惭,當(dāng)前一天內(nèi),level為SEASLOG_ERROR 的信息列表:
array(2) {
[0] =>
string(66) "error | 8568 | 1393172042.717 | 2014:02:24 00:14:02 | test error 3 "
[1] =>
string(66) "error | 8594 | 1393172044.104 | 2014:02:24 00:14:04 | test error 3 "
}
同理,取當(dāng)月
$detailErrorArray_mouth = SeasLog::analyzerDetail(SEASLOG_ERROR,date('Ym',time()));
*/