logrotate はログファイルのローテーション、圧縮、古いログファイルの削除を行うことができ、ほとんどの Linux ディストリビューションにはデフォルトで logrotate がインストールされており、毎日自動的に実行されます。
logrotate の設定ファイル#
ファイル /etc/logrotate.d/app
を作成して編集します。一般的に、/etc/logrotate.conf
には include /etc/logrotate.d
という設定があり、これにより /etc/logrotate.d
ディレクトリ内の設定ファイルが自動的に読み込まれます。
/root/app/log/app.log {
daily # 毎日ローテーション
missingok # ログファイルが存在しなくてもエラーを報告しない
rotate 100 # 100 個のログファイルを保持
compress # 古いログファイルを圧縮
delaycompress # 次回のローテーションまで圧縮を遅延
notifempty # ログファイルが空でない場合のみローテーション
dateext # 現在の日付をログファイルのサフィックスとして使用
dateformat -%Y%m%d # 日付フォーマットを設定
olddir /root/app/log/old # 古いログファイルの保存ディレクトリを設定、このディレクトリは事前に作成する必要があります
sharedscripts # スクリプトはすべてのログローテーション後に一度だけ実行され、各ファイルごとに実行されるわけではありません
postrotate # ログローテーション後に実行されるスクリプト
/usr/bin/docker restart app
endscript # スクリプトの終了
}
注意:サービスを再起動する際、ネットワークが切断される可能性があるため、注意が必要です。この方法を使用して、再起動プロセス中にネットワークが切断されるかどうかをテストできます。
for i in {1..1000}; do { curl -I https://example.com/; sleep 0.3; } ; done
テスト#
ここでは logrotate コマンドを直接使用してテストします。-d はデバッグモードを示し、-f は強制実行を示し、-v は詳細モードを示します。実行プロセスを見ることができます。デバッグモードでは実際には実行されず、実行プロセスが表示されるだけで、テストに使用できます。
logrotate -dfv /etc/logrotate.d/app
デバッグモードを解除した後、結果は以下の通りです。
$ tree
.
├── app.log
└── old
├── app.log-20231116.gz
└── app.log-old
1 ディレクトリ, 3 ファイル
可能性のある問題#
- 権限: 現在、root ユーザーを直接使用しているため、権限の問題には直面していませんが、他のユーザーの場合は権限の問題が発生する可能性があるため、注意が必要です。
- 再起動: postrotate 内のスクリプトはログローテーション後に実行されるため、サービスを再起動する場合、ネットワークが切断される可能性があるため、注意が必要です。
- ファイルサイズによるローテーション: ファイルサイズによるローテーションの場合、ログファイルが切り捨てられる可能性があるため、注意が必要です。ここではファイルサイズによるローテーションを使用していないため、この問題には直面していません。
参考資料#
- Linux ログ切り替え神器 logrotate 原理紹介と設定詳細 - logrotate の原理について詳しく書かれた良い記事です。
- logrotate (8) - Linux マンページ - logrotate の公式ドキュメントで、logrotate の詳細な設定を確認するために使用します。