最近公司的日志传输服务器因网间带宽被调整后出现了日志堵塞的情况,更为严重的是公司大量的业务日志也是通过 PHP 的 syslog接口传输的。这样,因为rsyslog的新版本默认不期望丢弃任何数据,而rsyslog中的日志又传输不出去,导致了业务在写日志的时候“被”堵塞住了。
拿到rsyslog的配置后,发现仅有一些简单的关于传输逻辑的配置,而关于rsyslog进程、队列、传输效率的配置参数都采用默认,这种仅仅能够 work around 的配置在测试或运行初期是允许存在一段时间的,在系统、环境正常的时候能够运行。一旦出现异常,各种问题就全出来了。
推荐的文档和我认为比较关键的配置请见下图:
- 推荐仔细阅读 第一篇 关于 rsyslog queue的文档,细节几乎都在这篇文档里。
- 定义 $MainMsgQueueFilename 可以简单理解为队列入口无限大,$MainMsgQueueMaxDiskSpace来控制大小。
- 队列的堵塞可能的原因是各种其他原因导致的 MainMsg 满了,而默认配置下,rsyslog不主动丢弃消息。
- $QueueHighWatermark可以控制 MainMsgQueue 如何使用 disk作为队列存储,而不再是仅仅使用内存。
- $MainMsgQueueDiscardMark 和 $MainMsgQueueQueueDiscardSeverity 配合控制如何丢弃消息。
- 在我的 x220i ubuntu 环境下,可以看到几十G的队列文件(网络传输堵塞时以及进入的消息量过大时)、丢弃消息的通知,内存使用的状况。因这一切都不复杂,不再赘述。
- rsyslogd的RELP(http://www.librelp.com/)相关的内容暂未涉及。
补充文档:
- http://www.gerhards.net/download/LinuxKongress2010rsyslog.pdf
- http://mperedim.wordpress.com/2010/01/21/rsyslog-evaluation/
- On the (un)reliability of plain tcp syslog :http://blog.gerhards.net/2008/04/on-unreliability-of-plain-tcp-syslog.html
- The Simple Event Log Protocol (SELP) :http://www.monitorware.com/en/workinprogress/selp.txt
- RELP - the reliable event logging protocol :http://blog.gerhards.net/2008/03/relp-reliable-event-logging-protocol.html
刚好微博上 @zzyongx 也提供了一个 syslog-safer (https://github.com/zzyongx/syslog-safer) 软件,大家也可以试试。