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

Scrambled output when constructing a syslog message

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

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 订阅后发送到系统日志之前的最后一条消息看起来像

<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 连接套接字时,它会产生混乱的输出。

(注意这里的IP是localhost IP,而不是消息中的hostname,在使用类似kafka消息的情况下,完美记录了原来的hostname。)

谁能帮我看看哪里乱码了,我应该怎么做才能不乱码?

我是用 golang 来编程的。

-- 斯科特.

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