0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

loglotateが使えなかったため、shellscriptとcrontabによってログローテーションを実装

Last updated at Posted at 2025-01-31

ログローテーションとは

ログファイルが一定のファイルサイズに達したり、一定の期間が経過したら、ファイル名を変更してログファイルを切り分け、古くなったログファイルは消去する作業を言います。これによって、ログファイルの肥大化を防ぎます。

logrotate(ログローテート)とは

ログファイルをローテーションし、必要に応じて圧縮などを行うツールです。多くのLinuxディストリビューションで採用されています。

「logrotate」は、デーモンではなく「cron」によって実行されます。このため、logrotateの利用にはcronが動作していることが必須となります。もっとも、たいていの場合cronはデフォルトで動作しているはずです。また、logrotateの設定ファイルを変更したとしても、サービスの再起動は必要ありません。

logrotateの仕様

/etc/logrotate.confでログローテーション全体の設定ができ、
各サービスごとの設定をしたい場合は、/etc/logrotate.d配下に設定ファイルを作成することで利用することができます。

※詳細は以下記事が分かりやすかったです
https://qiita.com/shotets/items/e13e1d1739eaea7b1ff9

今回やりたかったこと

毎日出力されるアプリケーションログにおいて、3日経過したものをローテーションして削除したかった。
また、今回は圧縮も行わない設定としたかった。
最初は、logrotateを使用してログ削除を行いたかったのですが、ここで問題が発生。

/etc/logrotate.conf
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は下記のような実装を行いました。

delete.sh
#!/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を上手く活用することもできますので、なにかのご参考になると幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?