Armadilloフォーラム

コンテナ内のアプリケーションのログの永続化について

tmygt

2025年4月17日 14時02分

コンテナ内で実行するアプリケーションのログを永続化させる方法を検討しています。ローテートもしたいです。
アプリケーションをPythonで実行しているため、当初はRotatingFileHandlerを使うつもりだったのですが、RotatingFileHandlerはmultiprocessingと併用できないことが分かったため、別の方法を検討しています。

下記2案を考えているのですが、よりよい方法は無いでしょうか?

1. コンテナ内でrsyslogdを起動する。

https://armadillo.atmark-techno.com/forum/armadillo/10984 に記載の様に、rsyslogdを起動しておき、アプリケーションからはSyslogにログを流す。rsyslog.confで volumes 領域のファイルを指定する。

この場合rsyslogdが終了してしまった場合の再起動が面倒だと考えています。
ログのローテートはABOS側のlogrotateを使います。

2. log-driver=json-fileを使う

標準出力、標準エラー出力にメッセージを出力すると、ABOSからpodman logs でログとして確認できる認識です。log-driverにjson-fileを指定しておけば任意のファイルに出力できるので、これをつかう。ログのローテートはABOS側のlogrotate。

お手数をおかけしますが、よろしくお願い致します。

コメント

連投すみません。2は標準出力標準エラー出力が排他制御されていないのでダメですね。。。

at_dominique.m…

2025年4月17日 14時51分

tmygtさん

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

> RotatingFileHandlerはmultiprocessingと併用できないことが分かったため、別の方法を検討しています。

multiprocessing で使えないですね…

> 1. コンテナ内でrsyslogdを起動する。
>
> https://armadillo.atmark-techno.com/forum/armadillo/10984 に記載の様に、rsyslogdを起動しておき、アプリケーションからはSyslogにログを流す。rsyslog.confで volumes 領域のファイルを指定する。
>
> この場合rsyslogdが終了してしまった場合の再起動が面倒だと考えています。
> ログのローテートはABOS側のlogrotateを使います。

面倒な面もありますが、ABOS側に cron / logrotate はないので、logrotate までコンテナに持ち込まないといけないですね。
ABOS側の syslog は busybox syslogd 内の rotate 仕組みで RotateingFileHandler のようにサイズを確認しながらログを出力していますので、logrotate は起動してません。

> 2. log-driver=json-fileを使う
>
> 標準出力、標準エラー出力にメッセージを出力すると、ABOSからpodman logs でログとして確認できる認識です。log-driverにjson-fileを指定しておけば任意のファイルに出力できるので、これをつかう。ログのローテートはABOS側のlogrotate。

log-driver=json-file はすでにデフォルトの値です。
また、logrotate もすでに自動に行っています(これも conmon が勝手にやってくれてますが、container のコンフィグファイルの「set_log_max_size」でサイズを1MBのデフォルト値から変更できます)

デフォルトのパスは /run にありますが(「podman inspect --format '{{.HostConfig.LogConfig.Path}}' mycontainer」で確認かのう)、「add_args --log-opt=path=/var/log/foo.json」で変更できますので、妥当な案だと思います。

> 標準出力標準エラー出力が排他制御されていないのでダメですね。。。

アプリケーション以外が stdout/stderr に書ける、また multiprocess で同時に書くと危ない、ということですね?
アプリのプロセスだけでしたら、ログする時に flock(1, LOCK_EX) / log / flock(1, LOCK_UN) で出力すればそんなに難しくないと思いますが、たしかにちょっとう面倒ですね。
やってくっるログライブラリがあるかもしれません。

また、第3案としては abos の syslog を直接に使ってもいいと思います。
デフォルトでは /var/log/messages に出力して 4MB~8MB までしか保存してないですが、それでたりるのであればそのまま使うのは一番楽だと思います(コンテナに /dev/log を add_volumes で渡すだけで、python から syslog を利用できます)
ログの量が足りない場合は /etc/conf.d/syslog で 「-t -O /var/app/volumes/syslog -b 4 -s $((32*1024))」 のような設定を行えば appfs でいくらでも増やせます。

いかがでしょうか。

マルティネさん

お世話になっております。回答ありがとうございます。

> また、第3案としては abos の syslog を直接に使ってもいいと思います。
> デフォルトでは /var/log/messages に出力して 4MB~8MB までしか保存してないですが、それでたりるのであればそのまま使うのは一番楽だと思います(コンテナに /dev/log を add_volumes で渡すだけで、python から syslog を利用できます)
> ログの量が足りない場合は /etc/conf.d/syslog で 「-t -O /var/app/volumes/syslog -b 4 -s $((32*1024))」 のような設定を行えば appfs でいくらでも増やせます。

提案ありがとうございます。これがシンプルなのでこの案を取り入れたいのですが1点確認させてください。

https://armadillo.atmark-techno.com/forum/armadillo/10984 の 2022年2月10日 15時41分 のマルティネさんの投稿の下記部分で利用を避けるようにコメントされています。こちらは問題ないでしょうか? volumes下のファイルを指定していれば使ってよいということでしょうか?

> * syslogが必要の場合は大澤さんの言うとおりに別のコンテナでもでsyslogを起動してください。ホストのsyslogは/var/logで書きますが、容量が小さいのでそちらはBaseOS用のログのみに使ってください。

at_dominique.m…

2025年4月17日 17時22分

マルティネです。

> > * syslogが必要の場合は大澤さんの言うとおりに別のコンテナでもでsyslogを起動してください。ホストのsyslogは/var/logで書きますが、容量が小さいのでそちらはBaseOS用のログのみに使ってください。
>
> https://armadillo.atmark-techno.com/forum/armadillo/10984 の 2022年2月10日 15時41分 のマルティネさんの投稿の下記部分で利用を避けるようにコメントされています。こちらは問題ないでしょうか? volumes下のファイルを指定していれば使ってよいということでしょうか?

はい、パスを変えて保存量を増やせば大丈夫だと思うようになりました。
ABOS で /var/log/messages でなにか明確にログを探すようなものはないので、自分で把握さえしていればその面では問題ありません。

簡単にできれば別けた方がいいとは思いますが(なにかの不具合でABOSのログを送って欲しいとき等あれば)、数日分のログを保存できていれば後で整理(grep -v アプリ名など)でどうにかなります。
(コンテナに busybox がインストールされていたら別の busybox syslog のローテート機能を使うなども考えれますね…残念ながら busybox syslogd に別のパスでソケットを作るやログを分ける機能等はないですが、コンテナ内で実行すればそれもそれで対応できますね)

よろしくおねがいします。

マルティネさん

ABOSのsyslogを使っても問題ない旨承知いたしました。それであれば、ABOSのsyslogを使うことにします。ローテートもまずはABOSのbusyboxの機能で問題ないかどうか確認してみます。

以上、ありがとうございました。