rsyslogd的默认配置以传统格式写入日志条目,如下所示:
Nov 30 10:40:01 localhost CRON[30786]: pam_unix(cron:session): session closed for user list
Run Code Online (Sandbox Code Playgroud)
没有年份,这对于处理日志的工具来说很不方便,并且需要每个条目的确切时间戳,因此必须实施猜测年份的黑客。
我们可以将 rsyslogd 切换到一个名为的内置模板RSYSLOG_FileFormat
,该模板会更改为高精度时间戳。虽然这是 RFC 时间戳格式适合处理,但它是冗长的胡言乱语,没有人眼难以看到的空白。
2013-11-30T10:50:01.478204-08:00 localhost CRON[31200]: ...
Run Code Online (Sandbox Code Playgroud)
不幸的是,rsyslogd 的模板系统非常不友好,文档也很差。令人难以置信的是,对于这个模板系统中所有不必要的复杂性, 的值dateformat
显然与选择的硬编码 C 相关联enum
!
有一些参数,$YEAR
但这些只是提取当前时间,而不是从消息时间戳中提取的时间,所以这是一个黑客。
我只想专注于编写处理条目的程序。
我可以放入rsyslogd.conf
文件以获得准确输出的正确简介是什么:
Nov 30 2013 10:40:01 localhost CRON[31200]: ...
Run Code Online (Sandbox Code Playgroud)
只是传统的模板,加上年份。
好吧,我从它的 git 中取出 rsyslog,从最接近我的系统运行的行创建一个分支并修补它:
2013-11-30 13:39:59 localhost sshd[17331]: Accepted publickey for kaz from 192.1...
Run Code Online (Sandbox Code Playgroud)
由于这些rsyslog.conf
行,现在生成了上述内容:
$template CustomFormat,"%timegenerated:::date-strftime(%Y-%m-%d %H:%M:%S)% %HOSTNAME% %syslogtag%%msg%0\n"
$ActionFileDefaultTemplate CustomFormat
Run Code Online (Sandbox Code Playgroud)
问题中给出的格式只是%b %d %Y %H:%M:%S
.
新事物是date-strftime(...)
指定基于strftime
格式的日期属性。
这适用于日志消息中的时间(接收时间或生成时间)。
接触到这个代码库后,我现在要去淋浴和泡在浴缸里。
2016 年 2 月更新:
看起来这个话题出现在 2014年的 rsyslogd 邮件列表中,并引用了这个 Unix Stackexchange 问题(原发帖者抱怨date-strftime
在他使用的 rsyslogd 版本中不起作用。不开玩笑!)
这导致了问题 65,它完全忽略了strftime
基于我的补丁的存在,并采用了一种笨拙的方法,对星期几、小时、年份等进行自定义替换项目。例如,要获得年份,您必须使用%timestamp:::date-year%
. %timestamp:::xxx
必须为日期的每个元素重复这种冗长的内容!
于是%timestamp:::date-strftime(%Y-%m-%d %H:%M:%S)
变成:
%timestamp:::date-year%-%timestamp:::date-month%-%timestamp:::date-day% %timestamp:::date-hour%:%timestamp:::date-minute%:%timestamp:::date-second%
Run Code Online (Sandbox Code Playgroud)
好伤心!
归档时间: |
|
查看次数: |
22896 次 |
最近记录: |