読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】ログが app.log.1 と app.log.2.gz に分かれてる。logrotate の rotate・daily・compress・delaycompress・postrotate【LPICレベル1】

23レスカテゴリ:Linux
1: 名無しさん

/var/log を見たら syslog、syslog.1、syslog.2.gz、… って並んでた
なんで .1 だけ圧縮されてないん

2: 名無しさん

前提のおさらい。rsyslog はセレクタごとに /var/log の下のファイルにログを追記し続ける。放っとくとファイルはどんどん大きくなる

3: 名無しさん

>>2
それを古い順に回して、一定の数だけ残すのが logrotate。cron.daily か logrotate.timer(OnCalendar=daily)で毎日動いて、設定に合ったものだけ回す

4: 名無しさん

>>3
設定はどこ?

5: 名無しさん

>>4
全体の設定が /etc/logrotate.conf、パッケージごとの設定が /etc/logrotate.d/ の下。Debian の logrotate.conf は
weekly
rotate 4
create
include /etc/logrotate.d
で、毎週回して4世代残し、回した後に空のファイルを作る

6: 名無しさん

>>5
logrotate.d の rsyslog の中身は?

7: 名無しさん

>>6
対象のファイル(syslog、auth.log など)を並べて、{ } の中に
rotate 4、weekly、missingok、notifempty、compress、delaycompress、sharedscripts
postrotate 〜 endscript の間に rsyslog に知らせるスクリプト

8: 名無しさん

>>7
それぞれの意味は?

9: 名無しさん

>>8
rotate N:N 世代残す
daily・weekly・monthly:回す間隔。size 100M なら大きさで
missingok:ファイルがなくてもエラーにしない
notifempty:空なら回さない
compress:古いのを gzip で圧縮
delaycompress:1つ前(.1)だけは圧縮せずに、次に回すときに圧縮する
create 0640:回した後に、その権限で新しいファイルを作る

10: 名無しさん

>>9
delaycompress がさっきの答えか。書きかけのプログラムがまだ .1 に書いてることがあるから、すぐには圧縮しない

11: 名無しさん

>>9
postrotate は何のため?

12: 名無しさん

>>11
プログラムは開いたファイルに書き続けるから、名前を変えただけやと古いほう(.1)に書き続ける。postrotate でプログラムに「ファイルを開き直して」と知らせる(HUP のシグナルや reload)
sharedscripts を付けると、ファイルが何個あってもスクリプトは1回だけ

13: 名無しさん

>>12
開き直せないプログラムには copytruncate(コピーしてから元を空にする)。コピーの間に書かれた分はなくなることがある

14: 名無しさん

実際に動くところを見てみたい

15: 名無しさん

>>14
/workspace の下に app.log と設定ファイル(rotate 3、daily、compress、delaycompress、notifempty、create 0640、postrotate で印を書く)を作って、状態ファイルも -s で作業用の場所にして -f(強制)で5回回した

16: 名無しさん

>>15
結果
1回目:app.log app.log.1
2回目:app.log app.log.1 app.log.2.gz
3回目:app.log app.log.1 app.log.2.gz app.log.3.gz
4回目と5回目:同じ4つのまま(rotate 3 やから、いちばん古いのは消える)
postrotate は5回動いた。空にしてから回したら notifempty で回らなかった。作られたファイルは -rw-r-----

17: 名無しさん

>>16
残るのは今の1つと古い3つ。ディスクに置かれるのは

ファイル

18: 名無しさん

>>15
設定を試すだけで回したくないときは?

19: 名無しさん

>>18
logrotate -d 設定ファイル。デバッグモードで、何をするかを表示するだけで何もしない(試したら、その旨の warning も出た)。-v は動かしながら詳しく表示

20: 名無しさん

>>18
どこまで回したかは状態ファイル(Debian は /var/lib/logrotate/status)に残ってて、daily でも1日たってないと回さない。-f はそれを無視して回す

21: 名無しさん

>>2
journald のログも logrotate で回すん?

22: 名無しさん

>>21
回さない。journald は SystemMaxUse= などで自分で古いのを消す。logrotate はテキストのログファイル用

23: 名無しさん

>>9
rotate で世代、daily などで間隔、compress と delaycompress で .1 だけ生、postrotate で開き直させる、試すときは -d。syslog.1 の謎が解けた

管理人のひとこと