【问题标题】:Scrambled output when constructing a syslog message构建 syslog 消息时打乱的输出
【发布时间】:2017-07-30 16:48:47
【问题描述】:

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

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 测试集群中的 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

只有&lt;13&gt; 被添加到整个日志中。

现在,我尝试打开并读取 /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 消息写入系统日志连接套接字时,它会产生一个加扰的输出。

(注意IP是本地主机IP,而不是消息中的主机名。在使用类似kafka消息的情况下,它与原始主机名完美记录。)

有人可以帮助我了解它在哪里搞砸了,我应该怎么做才能让它不被打乱?

我是用 golang 来编程的。

-- 斯科特。

【问题讨论】:

    标签: logging go protocols syslog rsyslog


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多