環境
- ホスト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の設定でオーナー・アクセス権の変更と保存形式の指定を一本化したかった。 ↩