对系统日志消息格式感到困惑
Posted
技术标签:
【中文标题】对系统日志消息格式感到困惑【英文标题】:Confused with syslog message format 【发布时间】:2012-03-01 19:42:51 【问题描述】:我对系统日志消息格式有点困惑。我必须编写一个解析系统日志消息的程序。当我阅读我在 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...
所以现在我有点困惑。什么是正确的系统日志消息格式?这是 RFC 5424 废弃 RFC 3164 的规范版本问题?
【问题讨论】:
【参考方案1】:在这种情况下的问题是 apache 是通过标准 syslog(3) 或通过 logger 进行日志记录的。这仅支持旧的 (RFC3164) 系统日志格式,即这里没有结构化数据。 为了让 apache 日志中的字段显示为 RFC5424 结构化数据,apache 需要以这种方式格式化日志。
第一个示例不是正确的 RFC3164 系统日志,因为优先级值已从标头中剥离。正确的 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 系统日志消息被保存到删除优先级值的文件中。
另外两个是 RFC5424 格式。
【讨论】:
好的,所以我相信看到几乎所有 RFC3164 格式而不是 RFC5424 格式的日志消息是正常的,因为它已经存在了很长时间。这也意味着我必须编写一个支持这两种规范的解析器。你知道任何已经这样做的图书馆(不管是什么语言)吗? 为什么不使用现有的工具,例如 syslog-ng、rsyslog 或 nxlog? (请注意,我隶属于后者)。如果您需要从自己的程序中解析它,我可能会选择一种可以轻松处理文本文件的脚本语言,例如 perl 或 python。 我需要从我自己的程序中解析这些消息。我想我会使用 Python。但由于某种原因,解析 syslog 消息似乎并不像我想象的那么简单。可能是因为我需要支持两种不同的规范。我相信现在是开始编写单元测试的最佳时机。谢谢你的回答:)【参考方案2】:如果您可以访问系统上已安装的 syslog-daemon,您可以将其配置为以不同格式写入日志(本地或通过网络接收)。例如,rsyslogd 允许配置您自己的格式(只需编写一个模板),如果我没记错的话,还有一个内置模板可以以 json 格式存储。几乎任何语言的库都可以解析 json。
编辑:您也可以使 rsyslogd 成为您程序的一部分。 rsyslog 非常适合以两种 RFC 格式读取传入的 syslog。然后,您可以使用 rsyslog 以 JSON 格式输出消息。这样 rsyslog 会为您完成所有消息的分解。
【讨论】:
以上是关于对系统日志消息格式感到困惑的主要内容,如果未能解决你的问题,请参考以下文章