Total Pageviews

Monday, 16 July 2012

rsyslogd日志服务


一,简介
rsyslogd是一个加强版的syslogd,具有各种各样的新功能,典型的有:
1,直接将日志写入到数据库。
2,日志队列(内存队列和磁盘队列)。
3,灵活的模板机制,可以得到多种输出格式。
4,插件式结构,多种多样的输入、输出模块。

二,下载、安装
下载地址: http://www.rsyslog.com/Downloads-index-req-viewdownload-cid-1-orderby-dateD.phtml
安装: 经典的tar zxvf,configure,make,make install过程。

三,配置示例:
以下rsyslog.conf只有5行,但实现了udp日志接收、将日志写入到文件、将日志写入到数据库的功能。
$ModLoad imudp.so 
# provides UDP syslog reception
$UDPServerRun 518
# start a UDP syslog server at standard port 514
*.*    /tmp/rsys.log
$ModLoad ommysql
*.*    :ommysql:192.168.120.67,log,mg,123qwe

详细配置示例,参见: http://www.rsyslog.com/doc-sample.conf.html

四,syslog客户端 rsyslogd可以兼容系统原有的syslog配置文件,可以近乎完美的替换掉原有的syslogd。

但我希望rsyslogd是一个独立的系统,所以我将其配置为侦听518 UDP端口的独立服务器。 然后我使用PHP语言编写了一个简单的syslog客户端,通过UDP协议,直接将日志消息发送给 rsyslogd日志服务,达到最大的灵活性。
以下是syslog客户端代码:
function mgsyslog($level,$msg)

$server="192.168.120.67"; 
$port=518; 
$facility=1; 
$pid=posix_getpid(); 
$process="PHP[${pid}]"; 
$actualtime = time(); 
$month      = date("M", $actualtime); 
$day        = substr("  ".date("j", $actualtime), -2); 
$hhmmss     = date("H:i:s", $actualtime); 
$timestamp  = $month." ".$day." ".$hhmmss; 
$hostname=gethostname(); 
$pri    = "<".($facility*8 + $level).">"; 
$header = $timestamp." ".$hostname; 
$message = substr($pri.$header." ".$process.": ".$msg, 0, 1024); 
$fp = fsockopen("udp://".$server, $port, $errno, $errstr); 
if ($fp) 
{  
fwrite($fp, $message);  
fclose($fp);  
return true; 

return false;
}

具体的syslog协议可以参见RFC3164。

五,总结 PHP的所有日志都可以使用上面定制的syslog客户端发送到集中的日志服务器。 然后可以集中查看、处理。
另外,一个方便的WEB日志查看器可以在下面的地址获得: http://loganalyzer.adiscon.com/ 安装简单方便,用起来也不错。