我想解析日志文件。 syslogd 的日志文件格式是否在所有系统中都相同? 在我的系统 (Debian Lenny) 上,它是:
Mar 7 04:22:40 my-host-name ...
(我对...部分不太感兴趣)
我可以依赖这个吗?是否有一些或多或少官方的描述?手册页syslogd
描述了配置格式,但没有描述日志文件格式。
理想情况下,描述会为字段提供正式名称,如(日期、时间、主机、条目)或(日期时间、主机名、消息)。也许还会添加一些正则表达式。我想在我的脚本中使用这些名称和正则表达式,以避免不必要地偏离标准,并确保脚本可以在任何地方运行。
谢谢
克里斯
答案1
RFC 简介应该回答这个问题。据我所知:是的,通常情况如此。
答案2
Warner 向您指出的 RFC 3164 描述了 UDP 系统日志消息的网络格式,您可以依赖该格式通过网络传输,但 syslogd 在记录您的消息时可能会将一些略有不同的内容写入磁盘。
也就是说,您通常可以依赖类似于 RFC 中描述的系统日志条目,其形式大致如下:
DATE HOSTNAME TAG: MESSAGE
日期形式为Jan 1 00:00:01
主机名通常是短主机名,但可能是完全限定的(特别是当您从远程主机记录消息时)
标签是自由格式,但按照惯例不包含:
。它通常采用 形式procname[PID]
,并且我相信后面总是跟一个文字:
信息是自由形式的
如果您需要更好地保证日志格式的一致性,syslog-NG 值得一看——它可以让您定义字段并插入标记以确保您可以解析生成的文件。syslog-NG 还允许您从消息中包含元数据,例如设施+优先级值。但是,使用 syslog-NG 会将“无处不在”的定义简化为“运行 syslog-NG 且配置与您的配置相似的机器”。
答案3
魔鬼就在@warner 链接的 RFC 中:
4.1.3 syslog 数据包的 MSG 部分
MSG 部分将填充 syslog 数据包的剩余部分。这通常会包含生成消息的进程的一些附加信息,然后是消息的文本。此部分没有结束分隔符。syslog 数据包的 MSG 部分必须包含可见(打印)字符。传统上最常用的代码集也是八位字段中的七位 ASCII,就像 PRI 和 HEADER 部分中使用的代码集一样。在此代码集中,唯一允许的字符是 ABNF VCHAR 值(%d33-126)和空格(SP 值 %d32)。但是,不需要也不期望指示 MSG 中使用的代码集。可以使用其他代码集,只要 MSG 中使用的字符是类似于上述的可见字符和空格即可。选择 MSG 部分中使用的代码集时应考虑预期的接收者。如果消息中包含收件人无法查看或理解的代码集字符,则不会为查看该消息的操作员或管理员提供任何有价值的信息。MSG 部分有两个字段,称为 TAG 字段和 CONTENT 字段。TAG 字段中的值将是生成该消息的程序或进程的名称。CONTENT 包含消息的详细信息。这传统上是一种自由格式的消息,可提供事件的一些详细信息。TAG 是 ABNF 字母数字字符串,不得超过 32 个字符。任何非字母数字字符都将终止 TAG 字段,并将被视为 CONTENT 字段的起始字符。最常见的是,CONTENT 字段的第一个字符表示
这实际上意味着开发人员可以将任何他们想要的内容放入 CONTENT 中,因此实际上没有消息实际内容的标准,只有消息的组织。我可能会说这是一个缺陷,但我还不确定。