將年份添加到 rsyslogd 生成的條目中
rsyslogd的預設配置以傳統格式寫入日誌條目,如下所示:
Nov 30 10:40:01 localhost CRON[30786]: pam_unix(cron:session): session closed for user list
沒有年份,這對於處理日誌並且需要每個條目的準確時間戳的工具來說是不方便的,必須實施猜測年份的黑客。
我們可以將 rsyslogd 切換到一個名為的內置模板
RSYSLOG_FileFormat
,該模板會更改為高精度時間戳。雖然這是 RFC 時間戳格式可以很好地處理,但它是冗長的胡言亂語,沒有人眼難以理解的空格。2013-11-30T10:50:01.478204-08:00 localhost CRON[31200]: ...
不幸的是,rsyslogd 的模板系統非常不友好,文件也很差。令人難以置信的是,對於這個模板系統中所有不必要的複雜性, 的值
dateformat
顯然與硬編碼enum
的 C 選項相關聯!有類似的參數,
$YEAR
但這些只是拉出目前時間,而不是消息時間戳中的那個,所以這是一個 hack。我只想專注於編寫處理條目的程序程序。
我可以將什麼正確的簡介放入
rsyslogd.conf
文件中以獲得這個確切的輸出:Nov 30 2013 10:40:01 localhost CRON[31200]: ...
只是傳統的模板,加上年份。
好吧,我從它的 git 中取出 rsyslog,從離我的系統執行最近的線路創建一個分支並修補它:
2013-11-30 13:39:59 localhost sshd[17331]: Accepted publickey for kaz from 192.1...
由於這些
rsyslog.conf
行,現在產生了上述內容:$template CustomFormat,"%timegenerated:::date-strftime(%Y-%m-%d %H:%M:%S)% %HOSTNAME% %syslogtag%%msg%0\n" $ActionFileDefaultTemplate CustomFormat
問題中給出的格式只是
%b %d %Y %H:%M:%S
.新事物是
date-strftime(...)
指定基於strftime
格式的日期屬性。這適用於日誌消息中的時間(接收時間或生成時間)。
接觸到這個程式碼庫後,我現在要去洗澡和泡在浴缸裡。
2016 年 2 月更新:
看起來這個主題出現在 2014 年的 rsyslogd 郵件列表中,並參考了這個 Unix Stackexchange 問題(原始發帖人抱怨說
date-strftime
在他使用的 rsyslogd 版本中不起作用。不開玩笑!)這導致了issue 65,它完全忽略了
strftime
基於 my 的更新檔的存在,並採用了一種笨拙的方法,為星期幾、小時、年等自定義替換項目。例如,要獲得年份,您必須使用%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%
好心疼!