构建syslog消息时输出混乱

3

我是一款可以将已记录在文件中的标准syslog消息转换的程序,例如:

Mar  9 15:51:36 ldaptestserver slapd[392]: slap_global_control: unrecognized control: 1.3.6.1.4.1.42.2.27.8.5.1

将syslog消息转换为包括,

等内容的消息。

我能够从我的kafka测试集群中存储的syslog消息中完成这个操作,这些消息在视觉上看起来像:

2017-03-09T15:22:00.642769+00:00 ldaptestserver slapd[392]: slap_global_control: unrecognized control: 1.3.6.1.4.1.42.2.27.8.5.1

通过在优先级前添加并初始化到syslog端口的tcp连接,并将消息作为[]byte切片写入套接字。在从kafka订阅后发送到syslog之前,最终的消息如下所示:

<13>2017-03-09T15:22:00.642769+00:00 ldaptestserver slapd[392]: slap_global_control: unrecognized control: 1.3.6.1.4.1.42.2.27.8.5.1

仅在整个日志前添加了<13>

现在,我尝试打开并读取/var/log/syslog,构建了与上述类似的消息,而不是使用kafka。

<13>2017-03-08T12:29:02.231335+00:00 ldaptestserver slapd[392]: slap_global_control: unrecognized control: 1.3.6.1.4.1.42.2.27.8.5.1 // Original one from kafka that worked
<13>2017-00-01T16:18:04.000000+00:00 ldaptestserver slapd[392]: slap_global_control: unrecognized control: 1.3.6.1.4.1.42.2.27.8.5.1 // The message that is hand crafted.

但是,当我将[]byte消息写入syslog连接套接字时,它会产生混乱的输出。 scrambled output (请注意,IP地址是本地主机IP,而不是消息中的主机名。在使用类似kafka消息的情况下,它记录了原始主机名的完美日志。)
有人能帮助我理解出了什么问题,并告诉我该怎么做才能避免这种混乱吗?
我是使用golang编写的。
-- Scott.
1个回答

4

不要将从kafka提取的工作日志打印为string(),而是尝试直接转储[]byte切片本身。这将给您一堆数字,您可以将其转换为相应的ascii字符,并查看是否有任何分隔符(例如回车换行符)分隔标题中每个部分的末尾和消息行的末尾。如果您在打印时将其强制转换为string(),则无法看到这一点。很可能syslog服务器的解析器期望一个行终止符来区分标题部分或消息结束,但它找不到,会不断添加后续消息,直到解析器的缓冲区用完。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接