关于syslog协议

在使用rsyslog的时候,一般来讲,如果消息中含有换行符的话,这条消息会以换行符为分隔,视为多条消息;即: rsyslog协议是基于行处理的,而且,默认单个消息大小为2k(rsyslogd v5),rsyslogd v8默认单个消息大小为8k。

问题: 一般来讲,程序出错时的堆栈信息都是多行的,这种情况该如何处理呢?

办法1: 先将堆栈信息中的换行替换成其它字符

办法2: 其实rsyslog是可以支持换行的,只是不是想换就换的,在structure data中可以小心地换行

 

关于syslog协议有两个rfc:

  1. The BSD syslog Protocol rfc3164
  2. The Syslog Protocol rfc5424

其中:

rfc3164 定义的syslog协议是比较原始的用法,不支持消息的换行

rfc5424 是所谓的version为1的syslog协议,支持 structure data;就是这个structure data中是可以包含换行的; 当然,要严格遵照定义的格式的哦

两种协议格式解析的golang实现: https://github.com/jeromer/syslogparser

 

rsyslog (rsyslog-8.17.0)源码学习:

  1. runtime/stream.c 中是这么解析的

翻译下:

mode=0 单行模式,遇到回车算做消息结束

mode=1 空行分隔模式,遇到空行算作消息结束(就是相邻消息之间要已空行分隔)

mode=2 非空开头模式, 只要下一行空白(应该也包含tab吧)开头就算作上个消息的一部分,不视为新消息

不幸的是,目前发现只有imfile模块才支持这三种模式之间的选择,更不幸的时,imfile模块使用inotify配置时,mode=2有bug(我测试时不是有bug,是根本不能用)

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据