构造系统日志消息时的乱码输出

时间:2017-03-09 15:52:50

标签: logging go protocols syslog rsyslog

我正在编写一个程序,可以转换已经记录在文件中的标准系统日志消息,例如:

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

包含PRIheader

的系统日志消息

我能够通过存储在我的kafka测试集群中的系统日志消息执行此操作,该消息在视觉上看起来像

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来编程。

- 斯科特。

1 个答案:

答案 0 :(得分:4)

不要将从kafka中提取的工作日志打印为string(),而是尝试按原样转储[]byte切片。这将为您提供一组数字,您可以将其转换为相应的ascii个字符,然后您可以查看是否有任何分隔符,如carriage returnline feed分隔结尾消息的标题和行尾的每个部分。如果您在打印时将其投射到string(),则无法看到此信息。有可能是系统日志服务器的解析器期望一个行终止符来区分它无法找到的标题部分或消息的结尾,并继续附加后续消息,直到解析器的缓冲区用完为止。