ログローテーションとは
ログファイルが一定のファイルサイズに達したり、一定の期間が経過したら、ファイル名を変更してログファイルを切り分け、古くなったログファイルは消去する作業を言います。これによって、ログファイルの肥大化を防ぎます。
logrotate(ログローテート)とは
ログファイルをローテーションし、必要に応じて圧縮などを行うツールです。多くのLinuxディストリビューションで採用されています。
「logrotate」は、デーモンではなく「cron」によって実行されます。このため、logrotateの利用にはcronが動作していることが必須となります。もっとも、たいていの場合cronはデフォルトで動作しているはずです。また、logrotateの設定ファイルを変更したとしても、サービスの再起動は必要ありません。
logrotateの仕様
/etc/logrotate.confでログローテーション全体の設定ができ、
各サービスごとの設定をしたい場合は、/etc/logrotate.d配下に設定ファイルを作成することで利用することができます。
※詳細は以下記事が分かりやすかったです
https://qiita.com/shotets/items/e13e1d1739eaea7b1ff9
今回やりたかったこと
毎日出力されるアプリケーションログにおいて、3日経過したものをローテーションして削除したかった。
また、今回は圧縮も行わない設定としたかった。
最初は、logrotateを使用してログ削除を行いたかったのですが、ここで問題が発生。
daily # ログを毎日ローテーション
rotate 3 # ローテーションを 3 回分保持
missingok # ログファイルがなくてもエラーを出さない
notifempty # ログが空の場合はローテーションしない
例として、Applog_20250101.logをローテーションする場合、
1日目:
Applog_20250101.log (出力日)
2日目:
Applog_20250101.log_1
Applog_20250101.log
3日目:
Applog_20250101.log_2
Applog_20250101.log_1
Applog_20250101.log
4日目:
Applog_20250101.log_3
Applog_20250101.log_2
Applog_20250101.log_1
Applog_20250101.log
4日目:
Applog_20250101.log_4 (ログは削除される)
Applog_20250101.log_3
Applog_20250101.log_2
Applog_20250101.log_1
Applog_20250101.log
のような状況になりました。
アプリログが毎日出るとすると、その数分だけファイル数が増えていくという状況に…
これでは本末転倒だ!となり、他の方法を考えることになりました。
shellscriptとcrontabを使用したログローテーション
結果として実施した方法は、3日間経過したログファイルを削除するというロジックのshellscriptを実装し、crontabで設定した日時でそのシェルを実行し、ローテーションを行うという方法です。
shellscriptは下記のような実装を行いました。
#!/bin/bash
# 削除対象のディレクトリを指定(例: /path/to/directory)
TARGET_DIR="/path/to/directory"
# 3日以上前に更新されたファイルを検索して削除
find "$TARGET_DIR" -type f -mtime +3 -exec rm -f {} \;
# 終了メッセージ
echo "3日以上更新されていないファイルを削除しました。"
このシェルをcrontabによって、毎日午前9時に実行する場合、下記のような設定となります。
1.crontab の編集
ターミナルで crontab を編集するために、次のコマンドを実行します:
crontab -e
これにより、現在のユーザーの crontab ファイルが開かれます。
今回はroot権限で設定しました。
2.スケジュールの追加
crontab の編集画面に、毎日午前 9 時にスクリプトを実行するための行を追加します:
0 9 * * * temp/delete.sh
crontabについては、以下記事が分かりやすかったです。
https://qiita.com/nemutas/items/3f5816eabbf0eda5e6a9
まとめ
今回は、実現したかったことがlogrotateではうまく実装ができなかったため、shellscriptとcrontabを使用したログローテーションを実装しました。
条件によっては、logrotateを上手く活用することもできますので、なにかのご参考になると幸いです。