web-dev-qa-db-ja.com

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の値は、ハードコーディングされたC enumの選択肢に明らかにリンクされています!

$YEARのようなパラメータがありますが、これらはメッセージのタイムスタンプからではなく、現在の時刻を引き出すだけなので、ハックです。

エントリを処理するプログラムプログラムの作成に集中したいだけです。

この正確な出力を取得するためにrsyslogd.confファイルに挿入できる適切な表現は何ですか?

Nov 30 2013 10:40:01 localhost CRON[31200]: ...

従来のテンプレートに加えて、年。

5
Kaz

さて、私はその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%
_

やれやれだぜ!

9
Kaz

少し遅い答えですが、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でテスト済み

2
bat_ventzi

ファイル/etc/rsyslog.confで、行$ ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormatをコメント化します。これにコメントを付けると、RFC 3339形式のタイムスタンプが生成されます。これは、高精度のタイムスタンプです。

1
Manish Jain