在生产环境下,需要将一台IBM HTTP Server的Web应用日志通过syslog发送到远端的日志服务器。由于日志量比较大,采用了按日期自动分割的方式在本地存储日志,因此在一个日志目录下,会动态的产生很多日志文件。默认情况下,Linux自带的Rsyslog或者syslog-ng社区版均不支持读取/监听一个目录下的所有日志,只有购买收费版本才具备这一功能。研究了一下,只能采取这两种方式来适应:

  • 一种是在服务器上安装第三方插件
  • 另一种是更改日志记录的方式

第三方插件目前测试了几个,除了安装本身的syslog程序之外,还有很多相关的依赖包(libssl、perl等等)需要解决,这在某些生产环境下将会非常复杂,在AIX等专用系统上则更为麻烦。

经过我们推敲测试后,得出一个比较优化的方案,即不需要安装程序,也不影响原有的日志记录:
在HTTP服务器上增加一项新的日志,写到管道(PIPE),syslog-ng通过读取管道将日志输送到远程的UDP514端口。
注:管道是消息队列FIFO的机制,也是Apache官方推荐的一种高性能日志处理的建议,写入管道不会对服务器造成新的压力,也不会占存储空间。

具体操作:
1、在本机的某个目录(如home)建立PIPE:

mkfifo /home/log.pipe

2、在syslog-ng或syslog中增加如下描述(从PIPE发送给远程514)并Restart syslog:

source weblog {
pipe("/home/log.pipe");
};
destination biglog {
udp("10.x.x.x" port(514));
};
log {
source(weblog); destination(biglog);
};

3、在HTTP服务器上,在原有日志记录的基础上增加一项记录,写入到PIPE(需要Reload http服务):
如原先在apache上配置的是:

CustomLog /home/wwwlogs/www.log common

现在则新增加一项

CustomLog /home/wwwlogs/www.log common
CustomLog /home/log.pipe common

如需操作必须按照1-2-3的过程走,以上为建议的方案,供参考。