docker(apache)ログをファイルにパイプする次のcronjobがあります。
* * * * * flock -n /srv/www/htdocs/scripts/pipe.lock /srv/www/htdocs/scripts/pipe_docker_logs.sh
Pipeline_docker_logs.sh は次のタスクを実行します。
tail -f `docker inspect --format='{{.LogPath}}' docker_apache` >& /var/log/apache2/docker_apache_access.log &
このテールバックグラウンドプロセスによって作成されたファイルは、logrotate.dを介して回転されます。
ファイルが回転すると、tailプロセスは新しく作成されたファイルへの書き込みを停止します。 tailプロセスを終了し、cronがそれを再起動してログファイルへの書き換えを開始するのを待ちます。
今、ログが回転したら、シャットダウンまたは再起動コマンドが必要になると思います。たぶんcronがこれを行うのに間違った場所であり、logrotate.dはこれを行うべきですか?どのようなヒントがありますか?
ELKとFluentについて知っていますが…それはただのコンテナであり、少し過度だと思います。
ベストアンサー1
このファイルを回転させるためにlogrotateにカスタムディレクティブを追加したとします。もしそうなら、解決策はcopytruncate
。マニュアルページ
copytruncate
古いログファイルを移動して新しいログファイルを作成することを選択する代わりに、コピーを作成してから元のログファイルを切り捨てます。一部のプログラムでログファイルを閉じるように指示できないため、古いログファイルに永続的に書き込む(追加)できる場合に使用できます。ファイルのコピーとトリミングの間の時間間隔は非常に短いため、一部のロギングデータが失われる可能性があります。このオプションを使用すると、古いログファイルはそのまま残り、作成オプションは適用されません。
ここに例があります。
/var/log/custom_logs/*.log
{
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
copytruncate
}
お役に立てば幸いです。