リモートのrsyslogへのログ転送は、ログ情報としてはタイムゾーンは持っていないため、例えば日本時間4月30日の20時に、JSTに設定されているrsyslogサーバーへ、UTCのシステムからログを送信すると、9時間ズレて11時のログとして記録されてしまう。
手っ取り早い解決策は送信側システムのタイムゾーンを受信側と合わせれば良いけど、OSSのミドルウェアなどがタイムゾーン変更でどこに影響が出るかの確認が取れないとか、Distrolessコンテナで動いててタイムゾーンの変更が気軽にできないとか、いろんな事情でタイムゾーンの変更ができない場合もあると思う。
たとえばDistrolessベースでビルドされているFluent Bitで集めたPodのログをJSTのrsyslogサーバーへ転送する場合とか、ね。
そんな場合は受信側のrsyslogで、「受信側rsyslogでリモートからのログを受信した時刻で記録する」設定を入れてやれば、「タイムゾーンを変更したくないシステム」には変更を入れずに、rsyslogサーバーのタイムゾーンでログを集約できる。
(正確には時刻情報を受信側で上書きする、という動作)
設定方法
前置きが長くなったけど、設定は以下の通りで、テンプレート機能を使う。
デフォルトではRSYSLOG_TraditionalFileFormat
という書式が使用されており、以下のようにタイムゾーンや年の情報が含まれていない内容になっている。
template(name="RSYSLOG_TraditionalFileFormat" type="string" string="%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n")
これを「受信時の時刻を使用する」に変更するには、時刻の書式の%TIMESTAMP%
部分を%timegenerated%
に変更した内容の書式を別途定義してやる。こんな感じ。
(書式名はdate_localize_TraditionalFileFormat
)
template(name="date_localize_TraditionalFileFormat" type="string" string="%timegenerated% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n")
定義した時刻更新するフォーマットを使用するように、omfile
プラグインの設定を変更する。
-module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat") +module(load="builtin:omfile" Template="date_localize_TraditionalFileFormat")
これで、タイムゾーンの異なるシステムから送信されるログも、受信時に受信したrsyslogの時刻でログが記録されうようになる。
全体の設定(抜粋)はこんな感じ。(UDP受信設定)
# customize timestamp format module(load="builtin:omfile" Template="date_localize_TraditionalFileFormat") template(name="date_localize_TraditionalFileFormat" type="string" string="%timegenerated% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n") module(load="imudp") # needs to be done just once input(type="imudp" port="514")
環境
- Red Hat Enterprise Linux release 9.4 (Plow)
- rsyslog-8.2310.0-4.el9.x86_64
Ubuntuの場合
バージョンが古いわけじゃなさそうだけど、$
で始まる以前からある書式だとこんな感じ。
$template LocalTimeTraditionalFileFormat,"%timegenerated% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" $ActionFileDefaultTemplate LocalTimeTraditionalFileFormat
- Ubuntu 24.04 LTS
- 8.2312.0-3ubuntu9
参考
- Templates — Rsyslog documentation
- rsyslog.conf(5) - Linux manual page
- rsyslogでsyslogを受信した時刻でlogに出力する - うまいぼうぶろぐ
- rsyslogのタイムスタンプのフォーマット変更:Linuxの環境設定に関するメモ:SSブログ
余談
Fluent Bitで送信時にタイムゾーンを弄る方向で最初調べてて、Time_Offset
というパラメタがParserにあるんだけど使い方がわからなかったため、発想を変えて受信側rsyslogの設定でどうにかならないか調べたという流れ。