关于rsyslog:与syslog消息格式混淆

Confused with syslog message format

我对syslog消息格式有些困惑。 我必须编写一个解析syslog消息的程序。 当我阅读syslog-ng实例中的内容时,会收到类似以下的消息:

1
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时,消息示例如下所示:

没有结构化数据

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

或带有结构化数据

1
<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?


在这种情况下,问题是apache通过标准syslog(3)或通过logger进行记录。这仅支持旧的(RFC3164)syslog格式,即此处没有结构化数据。
为了使apache日志中的字段显示为RFC5424结构化数据,apache需要以这种方式格式化日志。

第一个示例是不正确的RFC3164系统日志,因为从头中剥离了优先级值。正确的RFC3164格式如下所示:

1
<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格式。


如果您有权访问系统上已安装的syslog守护程序,则可以对其进行配置,以不同格式写入日志(本地或通过网络接收)。例如,rsyslogd允许配置您自己的格式(只需编写一个模板),如果我记得正确,还可以使用json格式存储一个内置模板。并且几乎所有语言都有库可以解析json。

编辑:您也可以使rsyslogd成为程序的一部分。 rsyslog在读取两种RFC格式的入站系统日志方面非常出色。然后,您可以使用rsyslog以JSON输出消息。这样,rsyslog会为您完成消息的所有分解。