1、面临的问题
1、多个server后,日志分别存储在每个server的log目录下,管理起来不方便。
2、日志会引起的磁盘寻道及io会消耗系统性能
2、解决方案
初步设想了以下几种方案:
1、每个server生成的log每天定时上传至一个统一接收日志的服务器。但该方案无法解决以上中的问题2。
2、使用log4j2中的SocketAppender将日志输出到远程socket,在远程socket进行接收。看起来同时解决掉了问题1和2,但是未找到对应的远程接收服务器中间件,还需要自己来进行code。
3、在方案2的基础上,查找现成的可远程接收日志的中间件,有apache flume及linux系统自带的rsyslog入围。apache flume需要安装进行维护等,rsyslog在centos自带的组件,可以方便配置即可启用。而且rsyslog支持将日志写入文件或写入db中,配 置方便,如果以后需要日志存入db,修改也非常方便。
以上决定采用方案3。
3、具体操作过程
1、打开rsyslog的远程接收接口
vi rsyslog.conf
注释掉以下语句前面的’#’号:
$ModLoad imudp $UDPServerRun 514
重启 rsyslog:
service rsyslog restart
2、配置日志发送至rsyslog。
最初采用的是log4j2,但发现log4j2中暂时不支持SyslogAppender中的pattern。
于是项目转为使用logback。
以下是一个logback的例子配置:
<appender name="default" class="ch.qos.logback.classic.net.SyslogAppender"> <syslogHost>192.168.17.17</syslogHost> <port>514</port> <suffixPattern>A</suffixPattern> <facility>LOCAL7</facility> <suffixPattern>%date ${MODULE} igame.log [%thread] %logger{0}\(%L\) %p %msg </suffixPattern> </appender> <appender name="default_ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <queueSize>1024</queueSize> <appender-ref ref="default" /> </appender>
需要注意的是结点suffixPattern,MODULE 是从环境变量取出的值,igame.log标志存储的文件名。
3、配置rsyslod对日志进行router
$template DynFile,"/var/log/router-log/%msg:F,32:3%/%timegenerated:1:10:date-rfc3339%/%msg:F,32:4%" :source , \!isequal , "localhost" ?DynFile :source , \!isequal , "localhost" ~
以上代表接收到的日志存储在 /var/log/router-log/MODULE/日期/指定的文件名
重启rsyslog.
以上测试OK。
4、可改进的地方
tomcat7中的access log不支持直接发往rsyslog,改为logback输出access.log,成功,但用logback输出到rsyslog时出问题,一直无法接收到日志。
这里可以考虑下使用log4j2把日志输出到rsyslog中
现在遇到第二个问题了,我需要logback内的更多属性来router日志。现在的情况是exception日志,无法router.
5、小贴士
$EscapeControlCharactersOnReceive off
可以避免\t被转换为#011
2013.08.21记:centos中rsyslog是v5版本,最新版本是v7版本,怪不得遇到各种奇怪的问题,升级为最新的v7版本:http://www.rsyslog.com/rhelcentos-rpms/
0 条评论。