zaki work log

作業ログやら生活ログやらなんやら

[rsyslog] タイムゾーンが異なるリモートからのログ受信時にローカルの時刻で記録する (RHEL/Ubuntu)

リモートのrsyslogへのログ転送は、ログ情報としてはタイムゾーンは持っていないため、例えば日本時間4月30日の20時に、JSTに設定されているrsyslogサーバーへ、UTCのシステムからログを送信すると、9時間ズレて11時のログとして記録されてしまう。

手っ取り早い解決策は送信側システムのタイムゾーンを受信側と合わせれば良いけど、OSSミドルウェアなどがタイムゾーン変更でどこに影響が出るかの確認が取れないとか、Distrolessコンテナで動いててタイムゾーンの変更が気軽にできないとか、いろんな事情でタイムゾーンの変更ができない場合もあると思う。
たとえばDistrolessベースでビルドされているFluent Bit集めたPodのログをJSTのrsyslogサーバーへ転送する場合とか、ね。

そんな場合は受信側のrsyslogで、「受信側rsyslogでリモートからのログを受信した時刻で記録する」設定を入れてやれば、「タイムゾーンを変更したくないシステム」には変更を入れずに、rsyslogサーバーのタイムゾーンでログを集約できる。
(正確には時刻情報を受信側で上書きする、という動作)

設定方法

前置きが長くなったけど、設定は以下の通りで、テンプレート機能を使う。

www.rsyslog.com

デフォルトでは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")

環境

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

参考

余談

Fluent Bitで送信時にタイムゾーンを弄る方向で最初調べてて、Time_OffsetというパラメタがParserにあるんだけど使い方がわからなかったため、発想を変えて受信側rsyslogの設定でどうにかならないか調べたという流れ。

docs.fluentbit.io

github.com