构造系统日志消息时的乱码输出
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
系统日志消息,包括 PRI
、header
等
我能够通过存储在我的 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 return
或 line feed
分隔末尾header 中的每个部分和消息的行尾。如果您在打印时将其转换为 string()
,这将不可见。很可能系统日志服务器的解析器期望行终止符来区分 header 部分或消息的结尾,但它找不到,并继续附加后续消息直到解析器的缓冲区用完。
我正在编写一个程序,可以转换已记录在文件中的标准系统日志消息,例如:
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
系统日志消息,包括 PRI
、header
等
我能够通过存储在我的 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 return
或 line feed
分隔末尾header 中的每个部分和消息的行尾。如果您在打印时将其转换为 string()
,这将不可见。很可能系统日志服务器的解析器期望行终止符来区分 header 部分或消息的结尾,但它找不到,并继续附加后续消息直到解析器的缓冲区用完。