環境
- ホストOS: Ubuntu 20.04 LTS
- Docker: 24.0.2
- rsyslog: 8.36.0(rsyslog/syslog_appliance_alpine)
要約
rsyslog/syslog_appliance_alpine
のtimezoneをUTCからJSTに変更する際の要点は以下の3つ。
-
/etc/localtime
にJSTの情報を持つファイルを設定する。(ホストの/usr/share/zoneinfo/Asia/Tokyo
を流用するのが簡便。) -
/config/container_config
内のexport TZ=UTC
をexport TZ=/etc/localtime
にする。 - コンテナの設定で環境変数
TZ
にJST
を指定しても無意味。
動機
- rsyslogで収集したログファイルのオーナーを一般ユーザーにしようとしたら
/etc/rsyslog.conf
の設定でrsyslogの動作権限を変更しないといけないことが判明1。 - ホストで動作するrsyslogに特権を与えるのはセキュリティ的にどうかと考え、docker化を決意。rsyslog公式の
rsyslog/syslog_appliance_alpine
をベースに構成。 - TimezoneがUTCで固定されていることが判明。JSTにしたいと思った。
試して失敗したこと
コンテナの環境変数設定
コンテナのGitHubページに環境変数TZ
を設定すると書いてあったので、他のdockerイメージのように環境変数TZ
にJST
を設定してみた。
date
コマンドの出力はtimezone部分がUTCからJSTに変化したが、時刻自体はUTC時刻のままだった。この状態でもログのタイムスタンプには+00:00
で記録される。
tzdataのインストール
rsyslog/syslog_appliance_alpine
にはtzdata
が入っていないので、上記環境下でtzdata
を追加インストールしたが解決しなかった。
TZ
にAsia/Tokyo
やJapan
を設定しても解決せず。
/etc/localtimeを設定
Alpine Linux でタイムゾーンを変更するに書かれている方法を試したところ、date
コマンドの出力は日本時間になった。
しかし、ログに書き込まれる時刻はUTCのままであった。
解決法
1. このページに記載されているが、TZ
に/etc/localtime
を設定する。ただし、Dockerfileなどでの環境変数設定は無意味で、コンテナから/config/container_config
を一旦コピーしてきて、
export TZ=UTC
となっている行を、
export TZ=/etc/localtime
に変更し、改めて/config/container_config
に配置するよう設定する。
2. Alpine Linux でタイムゾーンを変更するに書かれている方法でもいいのだが、(やや邪道になるが)ホストOSの/usr/share/zoneinfo/Asia/Tokyo
がコンテナの/etc/localtime
に来るようにvolumeを設定しても機能する。
3. コンテナをbuildする。
動作確認
ホストのtimezoneファイルを流用する方法でコンテナを構成したところ、date
コマンドの表示が日本時間で表示され、ログに記録される時刻も(日本時間)+09:00
になった。
考察
コンテナイメージの最終更新が5年前と表示されていたり、非公式コンテナのGitHubページにはrsyslogにバグがある(から非公式コンテナを作った)ような書き方をしていたため、rsysylog公式イメージは古いバグがそのままになっているのかなという印象を受けて、修正できない問題と思い込むところだった。
おまけ
rsyslog/syslog_appliance_alpine
については起動してみたという記述くらいしか見かけないので、実際に使用する方法について書いておくと、ホストOSと違って/etc/rsyslog.conf
に$IncludeConfig /etc/rsyslog.d/*.conf
がないので、フォルダにファイルを放り込む方法は使えない。一方で、
include(file="/config/droprules.conf" mode="optional") # this permits the user to easily drop unwanted messages
という行があり、/config/droprules.conf
のオリジナルはコメント行だけなので、このファイルを/etc/rsyslog.d/*.conf
に入れるような内容にしても(本来の使い方からは外れているかもしれないが)動作する。
ちなみに、ここでフィルタリングされないログは/logs/hosts/<ホスト名>/messages.log
に格納される。
514:514/UDP
と書くところを514:514
と書いてTCPしかポート開放されておらずハマったのはナイショ。
愚痴
投稿するのボタンの仕様が右下で下書きと投稿を切り替える方式から、「右下にある」[公開設定]のボタンを押した後に「切り替わったキャンペーンの選択をする画面で」「右上にある」ボタンを押す方法に変わっていて、投稿が1日遅れた。
「公開設定」のボタンを押す前の画面の「右上にある」[投稿する]ボタンはドロップダウンメニューで、投稿する機能がないので余計に気づきにくかった。
投稿方法の説明などの記述は変わっていなかったので分からず、もう少しで不具合報告を書くところだった。
改訂履歴(表現の修正などは除く)
- 2023/3/1: 失敗してしばらく封印
- 2023/7/5: 初版
- 2023/7/6: 投稿。少し愚痴る。
-
logrotateを使えばできると思うが、今回はrsyslogの設定でオーナー・アクセス権の変更と保存形式の指定を一本化したかった。 ↩