Armadilloフォーラム

コンテナ内プロセスからのログ出力方法について

h-yuusuke

2022年2月10日 14時21分

お世話になっております。

現在、コンテナ内で実行されているプロセス(アプリケーション)からsyslogおよびlogrotateを使用してログファイルへのログ出力とログローテートを行いたいと考えており、それに関して下記の質問がございます。
・syslogやlogrotateを実行するためのコンテナをアプリケーション実行用コンテナとは別に用意する必要がありますでしょうか?
・コンテナを用意する必要がある場合、アプリケーション用コンテナとの連携はどのように行えばよいでしょうか?

コメント

at_ohsawa

2022年2月10日 14時59分

> ・syslogやlogrotateを実行するためのコンテナをアプリケーション実行用コンテナとは別に用意する必要がありますでしょうか?

これは好みに依ると思いますが、syslogdだけ動いているコンテナを作るメリットは
そんなに無いと思っています。syslogdはライブラリの依存関係に厳しいわけでも
無いので分離する意味は個人的には無いと思っています。

なので、syslogdやrsyslogを当該のコンテナにインストールして実行するよう
(自動実行されるようにDockerfileのCMDでsyslogd等を起動するように記述)
して利用するのが一番シンプルな使い方です。

このとき普通はrsyslogやsyslogdがOSのkernel messageをデフォルトで読もうとする
ので/proc/kmsgが開けない旨の警告を出しますが、コンテナ内でkernelのログを取る
意味は無いと思いますので無視して良いです。

loggerコマンドでコマンドラインからsyslogにメッセージを送れるので、それでテストも
出来るかと思います。
> ・コンテナを用意する必要がある場合、アプリケーション用コンテナとの連携はどのように行えばよいでしょうか?

一応、別のコンテナにsyslogサーバーがある場合にそこへログを投げる方法も
書いておきますと、rsyslogには自分のファイルシステムにログを書く以外に
IPとポートを指定してネットワーク経由で別のPCのrsyslogにメッセージを送ることができます。
なので、それを同じ方法をコンテナ間で実行すれば可能になります。
この場合でも、rsyslogが送り元、先の両方にインストールされて自動実行する
必要があるので、分離しても2つのrsyslogの管理が煩雑になるだけでメリットはあまりない
と思います。

at_dominique.m…

2022年2月10日 15時41分

h-yuusukeさん、

マルティネです。
お世話になってます。

大澤さんがすでに返事しましたが、syslog以外の手段がいくつかあるのでそちらも考慮にできればと思いました。

> ・syslogやlogrotateを実行するためのコンテナをアプリケーション実行用コンテナとは別に用意する必要がありますでしょうか?
> ・コンテナを用意する必要がある場合、アプリケーション用コンテナとの連携はどのように行えばよいでしょうか?

ログの管理はお客さんの自由ですが、想定しているパターンはいくつかあります:
- ディスクに残さなくてもよろしければ、ただstdout/stderrでログすれば podman logs で表示できますし、1月のアップデートからはpodmanによって自動的にロテートされてます。
デバグ用のログにはこれが一番便利かと思います。

- ディスクに残すとしたら、ボリュームを使って自分で管理する必要があります。
アプリケーションによって、いくつかのパターンがあります:
* アプリケーション内でローテーションを行います。
例えば、pythonのRotatingFileHandler や tcpdump の -C オプションなど、いくつかのプログラムがnativeでログのサイズを制限できます。自分で開発する場合はおすすめします。
* できなかったらlogrotateを使える必要が確かにあります。
logrotateは自分のアプリケーションから走らせるか、サイドコンテナに走らせるか、2月のアップデートからBase OSにインストールする予定なので、ホストの/etc/logrotate.d/にコンフィグファイルを追加するだけでもいいです。申し訳ないがこの場合は今月末までお待ち下さい。
ホストの場合はコンテナ内のpidを見れますし、pkill等でSIGHUPを送ることもできますので、連携が必要であればサイドコンテナよりは使いやすいと思います。
* syslogが必要の場合は大澤さんの言うとおりに別のコンテナでもでsyslogを起動してください。ホストのsyslogは/var/logで書きますが、容量が小さいのでそちらはBaseOS用のログのみに使ってください。

よろしくお願いします。