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
の値は、ハードコーディングされたC enum
の選択肢に明らかにリンクされています!
$YEAR
のようなパラメータがありますが、これらはメッセージのタイムスタンプからではなく、現在の時刻を引き出すだけなので、ハックです。
エントリを処理するプログラムプログラムの作成に集中したいだけです。
この正確な出力を取得するために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月の更新:
このトピックのように見えます rsyslogdメーリングリストに登場 、このUnix Stackexchange質問への参照付き(元の投稿者は、_date-strftime
_が彼のバージョンのrsyslogdで機能していないと不平を言っています)使用しています。冗談ではありません!)
これは issue 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%
_
やれやれだぜ!
少し遅い答えですが、rfc3339日付形式から年を切り取り、rfc3164日付形式の2つの部分の間に次のように接続できます。
$template myTemplate,"%timegenerated:1:6:date-rfc3164% %timegenerated:1:4:date-rfc3339% %timegenerated:8:15:date-rfc3164% %HOSTNAME% %syslogtag%%msg%\n"
*.* /var/log/my.log;myTemplate
Rsyslogd 7.4.4でテスト済み
ファイル/etc/rsyslog.confで、行$ ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormatをコメント化します。これにコメントを付けると、RFC 3339形式のタイムスタンプが生成されます。これは、高精度のタイムスタンプです。