对syslog消息格式感到困惑

23

我对syslog消息格式有些困惑。我需要写一个解析syslog消息的程序。当我在我的syslog-ng实例中读取时,我会得到像这样的消息:

Jan 12 06:30:00 1.2.3.4 apache_server: 1.2.3.4 - - [12/Jan/2011:06:29:59 +0100] "GET /foo/bar.html HTTP/1.1" 301 96 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729)" PID 18904 Time Taken 0

我可以清楚地确定真正的消息(在这种情况下是Apache访问日志消息),其余内容是关于syslog消息本身的元数据。

然而,当我阅读RFC 5424时,消息示例看起来像:

没有结构化数据

 <34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 - BOM'su root' failed for lonvick on /dev/pts/8

或者使用结构化数据

<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"] BOMAn application event log entry...

所以现在我有点困惑。正确的syslog消息格式是什么?这是规范版本的问题,其中RFC 5424取代了RFC 3164

2个回答

22
在这种情况下的问题在于Apache通过标准syslog(3)或logger进行记录。这只支持旧版(RFC3164) syslog格式,也就是说,这里没有结构化数据。
为了让Apache日志中的字段显示为RFC5424结构化数据,Apache需要以这种方式格式化日志。
第一个示例不是正确的RFC3164 syslog,因为优先级值从标题中剥离。正确的RFC3164格式应如下所示:
<34>Jan 12 06:30:00 1.2.3.4 apache_server: 1.2.3.4 - - [12/Jan/2011:06:29:59 +0100] "GET /foo/bar.html HTTP/1.1" 301 96 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729)" PID 18904 Time Taken 0

传统上,RFC3164 Syslog消息被保存到文件中时会删除其优先级值。

另外两个则采用RFC5424格式。


好的,我认为在RFC3164格式而不是RFC5424格式中看到几乎任何日志消息都很正常,因为它已经存在很长时间了。这也意味着我必须编写支持两种规范的解析器。你知道有没有任何库(无论语言)已经做到这一点了吗? - qwix
为什么不使用现有的工具,如syslog-ng、rsyslog或nxlog?(请注意,我与后者有关)。如果您需要从自己的程序中解析此内容,我可能会选择一种可以轻松处理文本文件的脚本语言,例如perl或python。 - b0ti
我需要从自己的程序中解析这些消息。我想我会使用Python。但由于某种原因,解析syslog消息似乎并不像我想象的那么简单。可能是因为我需要支持两个不同的规范。我相信现在是开始编写单元测试的完美时机。谢谢你的回答 :) - qwix

3
如果您可以访问系统上安装的syslog-daemon,您可以配置它以不同的格式编写日志(无论是本地接收还是通过网络接收)。例如,rsyslogd允许您配置自己的格式(只需编写一个模板),并且如果我记得正确,还有一个内置模板可将其存储为json格式。几乎任何语言中都有解析json的库。
编辑:您还可以使rsyslogd成为程序的一部分。rsyslog在读取两种RFC格式的传入syslog方面非常出色。然后,您可以使用rsyslog将消息输出为JSON。这样,rsyslog会为您完成所有消息的解构工作。

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