開発チームのチケット管理にredmineを使用していて、構築したときは気が付かなかったけど、調子がよくなかったので確認してみたらアプリケーションログが肥大化していた。。。
ヘビーに使われてはいるけど、1年経ってないのに90MBくらい。膨らむのはわかっているんだからredmine側でデフォルトでやってくれればいいのに、と思いながらローテート(ローテーション)の設定をしたのでメモ。
設定
ログの場所は以下(デフォルト)
1 |
/var/lib/redmine/log/production.log |
/var/lib以外に変えている場合でもredmine ディレクトリ配下にあるはず。
ローテートの方法は、Linux付属のパッケージ logrotate です。簡単、頼りになるやつ。
設定ファイルの書式は以下です。
1 2 3 4 5 |
ログファイル名(Path) { コマンド コマンド : } |
設定ファイルの作成先のディレクトリは以下です。ここにデーモンやアプリケーションごとに設定ファイルを作成します。
1 2 3 4 5 6 |
# ls -l /etc/logrotate.d -rw-r--r-- 1 root root 194 11月 15 2016 httpd -rw-r--r--. 1 root root 136 6月 10 2014 ppp -rw-r--r--. 1 root root 224 9月 8 2015 syslog -rw-r--r--. 1 root root 100 6月 16 2015 wpa_supplicant -rw-r--r--. 1 root root 100 12月 4 2015 yum |
たとえば、httpd のローテート設定は以下のようになっています。
1 2 3 4 5 6 7 8 9 |
/var/log/httpd/*log { missingok notifempty sharedscripts delaycompress postrotate /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true endscript } |
redmine のログをローテートするなら以下でよいと思います。redmine公式にもありますが。
1 2 3 4 5 6 7 8 |
vi /etc/logrotate.d/redmine /var/lib/redmine/log/*log { missingok # ログファイルが存在しなくてもエラーを出さずに処理を続行 notifempty # ログファイルが空ならローテーションしない copytruncate # ログを別名でコピーし、元のファイルの内容を空にする compress # 古いログをgzipで圧縮 } |
確認
-d オプションをつけて実行すると実際にローテートはされずにテストできます。正確にはデバッグですかね。-v をつけると詳細を表示してくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# logrotate -d /etc/logrotate.d/redmine reading config file /etc/logrotate.d/redmine Handling 1 logs rotating pattern: /var/lib/redmine/log/*log 1048576 bytes (no old logs will be kept) empty log files are not rotated, old logs are removed considering log /var/lib/redmine/log/production.log log needs rotating rotating log /var/lib/redmine/log/production.log, log->rotateCount is 0 dateext suffix '-20170601' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' renaming /var/lib/redmine/log/production.log.1.gz to /var/lib/redmine/log/production.log.2.gz (rotatecount 1, logstart 1, i 1), renaming /var/lib/redmine/log/production.log.0.gz to /var/lib/redmine/log/production.log.1.gz (rotatecount 1, logstart 1, i 0), copying /var/lib/redmine/log/production.log to /var/lib/redmine/log/production.log.1 truncating /var/lib/redmine/log/production.log compressing log with: /bin/gzip removing old log /var/lib/redmine/log/production.log.2.gz error: error opening /var/lib/redmine/log/production.log.2.gz: そのようなファイルやディレクトリはありません |
おっと、エラーがでてます。1回目だからですかね。***.log.2 がないと怒られました。ファイルだけ作って再度テストしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# touch /var/lib/redmine/log/production.log.2.gz # logrotate -dv /etc/logrotate.d/redmine reading config file /etc/logrotate.d/redmine Handling 1 logs rotating pattern: /var/lib/redmine/log/*log 1048576 bytes (no old logs will be kept) empty log files are not rotated, old logs are removed considering log /var/lib/redmine/log/production.log log needs rotating rotating log /var/lib/redmine/log/production.log, log->rotateCount is 0 dateext suffix '-20170601' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' renaming /var/lib/redmine/log/production.log.1.gz |
問題なさそうです。
すぐにローテートしたければ、-f をつけて実行すると手動で実行できます。
1 |
# logrotate -f /etc/logrotate.d/redmine |
/var/lib/redmine/log/配下を確認して、production.log.数字ができていればOKです。
実際に実行してみた結果が以下です。ローテート前は50MBくらいあったファイルが50KBほどに圧縮されています。実行前のログは dd コマンドで作成したダミーファイルを使ったため、実際に以下の比率で圧縮されるとは限らないのであしからず。
1 2 3 4 5 6 7 8 9 10 11 12 |
# ローテート前 # ls -l -rw-r--r-- 1 root root 52428800 6月 21 23:52 production.log -rw-r--r-- 1 root root 54272 6月 21 23:52 production.log.2.gz # ローテート処理 # logrotate -f /etc/logrotate.d/redmine #ローテート後 # ls -l -rw-r--r-- 1 root root 0 6月 21 23:53 production.log -rw-r--r-- 1 root root 50913 6月 21 23:52 production.log.1.gz |
以上です。
↓↓↓ 持っていると便利な一冊。