转载请注明出处《http://blog.csdn.net/guosha》
它山之石,可以攻玉,日志子系统是每个软件平台必不可少的功能,本文介绍利用syslog-ng, logrotate, monit等工具来实现一个强大的日志管理系统。
应用程序API:
应用编程接口非常简单,进程启动时,调openlog(...)为你的程序打开一个到syslog的连接,然后可以调用syslog(...)进行日志记录,最后程序退出时调用closelog()关闭到syslog的连接。这三个接口在<syslog.h>里定义,原型如下:
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);
因为很多Linux下的第三方软件都会选一个特定的facility输出日志,所以openlog的参数三最好选LOG_LOCAL系列,这样就可以基于facility做一个简单的过滤就可以把只包含你的应用程序的日志重定向到一个目的地
有关这三个接口的更多细节请 man 3 syslog
日志输出管理:
syslog-ng是一个比syslog更高级的日志管理工具,如果你已成功安装syslog-ng,默认的配置文件在/etc/syslog-ng/syslog-ng.conf.
配置文件的由五大部分组成:
option: 定义一些全局选项。比如
options { sync (0); time_reopen (10); log_fifo_size (1000); long_hostnames (off); use_dns (no); use_fqdn (no); create_dirs (no); keep_hostname (yes); };
source: 定义日志的来源。比如:
source s_sys { file ("/proc/kmsg" log_prefix("kernel: ")); unix-stream ("/dev/log"); internal(); # udp(ip(0.0.0.0) port(514)); };
destination: 定义日志的目的地。比如:
destination d_adm_monit { file("/adm/log/AdmMonit.log"); };
filter: 定义日志的过滤规则。比如:
filter f_adm_monit { facility(local2);};
log: 定义从哪来的日志经过哪条规定过滤后输出到哪个目的地,比如:
log { source(s_sys); filter(f_adm_monit); destination(d_adm_monit); };
source可以配成从网络接收,destination也可配成发送到网络某个地址去,filter也可以更复杂,可对主机名,消息内容,消息级别等进行过滤,并且支持正则表达式。扩展性非常强.更多的细节请参考:
http://www.syslog.org/wiki/Main/Syslog-ng
如果完成了上面两步,那么当你运行你的应用程序后,你就检查应用程序输出的日志了,比如在上面的示例中日志输出到了文件:/adm/log/AdmMonit.log
logrotate:
如果你的日志存到本地文件,那么这个日志文件会越来越大,直到吞噬完整个硬盘。显然,定时手动去清除该日志文件是一个非程序员作法。
logrotate就是一个用于完成日志转储的实用工具,系统默认就会安装该工具,/var/log/message就是通过它来转储的。logrotate也有众多的选项可以配置,比如指定转储的压缩形式,只保持最近多少个文件等等,更多的细节请man logrotate.一个示例如下:
/adm/log/AdmMonit.log { notifempty create compress #6, 28, 496, 8128 ... ^_^ rotate 6 postrotate /usr/bin/kill -SIGHUP syslog-ng endscript }
用如下的命令:/usr/sbin/logrotate -f /adm/config/monit/app_log_rotate.conf就可以实现日志的转储了。
monit:
上面通过执行logrotate命令虽然可以实现日志转储,但该什么时候执行该命令呢?这里通常有两种选择,一种是通过注册crond定时任务,可以第一天或是每一星期进行一次转储。但如果应用异常突然以非常快的速度生产日志,那么这种定时转储的方式就有点不合适了。
另一种更好的方法是,当日志达到一定的大小后就进行转储.这可以通过另一款功能强大的系统监控软件monit来实现。其中的的日志转储部分配置如下:
check file AdmMonit.log with path /adm/log/AdmMonit.log if size > 50 MB then exec "/usr/sbin/logrotate -f /adm/config/monit/monit_log_rotate.conf"
更多的有关monit的强大功能,会另起一篇详细说明。另外更多细节,可参考http://mmonit.com/monit/
经过以上四步就完成了一个基本的日志系统的雏形,要真正应用到项目中,可能需要一些额外的精雕细刻,比如封装syslog等API,提供更强大的应用API. 重新打包syslog-ng的rpm包,使它包含为你的软件平台定制好的syslog-ng.conf.