日志分析是一个成熟的应用中必不可少的,由于现阶段很多系统都是通过多机负载的方式提供服务,多机的设置带来的问题是日志文件也会存放在多台主机之上。如果简单的进行非实时的日志分析,这样的局面只要进行一次日志合并就好了,不会影响太大,但对于实时日志分析而言,这样做的麻烦多多。你当然可以采用nfs或者其他类似的文件共享实现,这样的问题又会出现在时间同步上,同样的,日志的频繁更新,以及TCP的通讯代价,造成当分析较多主机的时候同样也会有诸多问题。
syslogd服务在几乎所有的Linux发行版中都会存在(或者用一个兼容的服务取代),且大部分都是默认安装的。它的优势在于使用了相对通讯成本较低的udp服务传输日志主体,而且采用统一的日志时间戳记,更方便的是,它还会自动的将主机戳记纪录在日志内容头部。
还是老样子,以Ubuntu为例吧。
Ubuntu用的是rsyslogd服务,这是一个增强版本的syslogd,它支持数据使用插件、直接调用模板、异步写数据库等相对高级的功能。默认是被安装的,但只对本机开放。它udp方式的日志传输是基于灵活的插件实现的,很容易启用。
vi /etc/rsyslogd.conf
# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
/etc/rsyslogd restart重启系统之后,它就会监听514端口的udp请求。当然,它也支持TCP方式的514监听,配置同样也是被注释了而已,大家自己研究吧。
增加一个日志纪录设备
默认的设备定义共有24个,建议使用local0(16)~local7(23)作为自定义的日志设备。默认情况下,ubuntu的日志设备定义保存在/etc/rsyslog.d下。我们新建一个local1设备,默认存储路径/var/log/test.log则方法如下:
vi /etc/rsyslog.d/90-local1.conf
local1.* /var/log/test.log
#local1.info /va/log/test.info.log
说到这里,syslog共有info到emerg总计7个“疼痛等级”,这里采用一个统配“*”代表所有报错等级,您自己可以分别处理了。
重启系统,开始测试。
import logging from logging.handlers import SysLogHandler import time handler = SysLogHandler(address=("192.168.1.206", 514), facility='local1') logging.getLogger().addHandler(handler) for i in range(0,2000): time.sleep(0.1) msg = "abc %s" % i logging.error(msg)
在另一台主机上执行,日志服务器端将会获得日志。
java用户可以通过log4j的配置进行定向,系统日志可以通过http://wiki.loggly.com/nginxlogging介绍的方式实现日志文件监控+推送。
此外分享一个PHP的方法
function mgsyslog($level,$msg) { $server="192.168.1.206"; $port=518; $facility=17; $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; }