在使用rsyslog的时候,一般来讲,如果消息中含有换行符的话,这条消息会以换行符为分隔,视为多条消息;即: rsyslog协议是基于行处理的,而且,默认单个消息大小为2k(rsyslogd v5),rsyslogd v8默认单个消息大小为8k。
问题: 一般来讲,程序出错时的堆栈信息都是多行的,这种情况该如何处理呢?
办法1: 先将堆栈信息中的换行替换成其它字符
办法2: 其实rsyslog是可以支持换行的,只是不是想换就换的,在structure data中可以小心地换行
关于syslog协议有两个rfc:
其中:
rfc3164 定义的syslog协议是比较原始的用法,不支持消息的换行
rfc5424 是所谓的version为1的syslog协议,支持 structure data;就是这个structure data中是可以包含换行的; 当然,要严格遵照定义的格式的哦
两种协议格式解析的golang实现: https://github.com/jeromer/syslogparser
rsyslog (rsyslog-8.17.0)源码学习:
- runtime/stream.c 中是这么解析的
翻译下:
mode=0 单行模式,遇到回车算做消息结束
mode=1 空行分隔模式,遇到空行算作消息结束(就是相邻消息之间要已空行分隔)
mode=2 非空开头模式, 只要下一行空白(应该也包含tab吧)开头就算作上个消息的一部分,不视为新消息
不幸的是,目前发现只有imfile模块才支持这三种模式之间的选择,更不幸的时,imfile模块使用inotify配置时,mode=2有bug(我测试时不是有bug,是根本不能用)