我正在尝试让 RHEL 6 上的 rsyslog 将消息记录的时间呈现为 unix 时间戳。我首先阅读了以下文档:http://www.rsyslog.com/doc/property_replacer.html。由于有旧式和新式属性选项,我接下来检查了我的版本号:
[root@sourwood remote]# rpm -qa | grep rsyslog
rsyslog-pgsql-5.8.10-6.el6.x86_64
rsyslog-5.8.10-6.el6.x86_64
[root@sourwood remote]#
对我来说,这意味着我正在使用版本 5.8。文档说在版本 6 以上时使用新式属性选项,因此,我应该使用旧式属性选项。
描述旧式选项的部分顶部指出下面列出的选项存在于高于 5.5.3 的版本中,因为 5.8.10 大于 5.5.3,所以这应该不是问题。
根据文档,我创建了以下模板(为了清晰起见,略微截断):
$template proxyTemplate,"%timegenerated:::date-unixtimestamp%|%timegenerated:::date-rfc3339%|...\n"
然后我按照以下方式使用该模板:
if \
$programname contains 'squid' \
then /var/log/remote/squid.log;proxyTemplate
来自 Squid 的消息确实被记录下来,并且 rfc3339 格式有效,但 unix 时间戳无效。以下是从日志中截取的样本:
Apr 29 14:59:09|2013-04-29T14:59:09.443172+01:00|...
我做错了什么吗?也许我错过了一些细节?还是我遇到了错误?
为了确保万无一失,我也尝试了新样式的属性选项,但无济于事。
答案1
不幸的是(因为我也想要这个),文档是错误的,这个功能实际上出现在版本 6.3.8 中。下面的文字解释了我的发现。
根据项目 git 存储库,第一次提及unixtimestamp
发生在提交 b88ba94 中,该提交仅从标签 v6.3.8 开始出现:
$ git clone git://git.adiscon.com/git/rsyslog.git
$ cd rsyslog
$ git log --reverse -S 'unixtimestamp' --oneline | head -1
b88ba94 added "date-unixtimestamp" property replacer option to format as a unix timestamp
$ git tag --contains b88ba94
v6.3.10
v6.3.11
v6.3.12
v6.3.8
v6.3.9
v6.4.0
...
$
然后我再次检查了 SRPM 中是否存在它,unixtimestamp
以防它被反向移植 - 但没有那么幸运。
最后,如果您使用命令调试配置rsyslogd -c 5 -d -N 1 -f /etc/rsyslog.conf
,您会看到 rsyslog 不知道的警告unixtimestamp
:
$ rsyslogd -c 5 -d -N 1 -f /etc/rsyslog.conf
...
8913.783769999:7f45539b3700: cfline: '$template NagiosPassiveServiceCheck, "%TIMESTAMP:::date-unixtimestamp% PROCESS_SERVICE_CHECK_RESULT;%hostname%;FOO;3;%msg:2:$%\n"'
8913.783783726:7f45539b3700: Invalid field option 'date-unixtimestamp' specified - ignored.
$
检查系统使用的兼容性参数的值-c
。此参数可以从根本上改变 rsyslog 解释配置文件的方式,因此请确保使用与生产中相同的级别开发和调试配置(请参阅/etc/sysconfig/rsyslog
以进行设置)。
作为 rsyslog 的替代品,也许值得看看 syslog-ng(可从 EPEL 存储库获得) - 它允许您输出以秒为单位的时间戳的消息。