/var/log を見たら syslog、syslog.1、syslog.2.gz、… って並んでた
なんで .1 だけ圧縮されてないん
【疑問】ログが app.log.1 と app.log.2.gz に分かれてる。logrotate の rotate・daily・compress・delaycompress・postrotate【LPICレベル1】
前提のおさらい。rsyslog はセレクタごとに /var/log の下のファイルにログを追記し続ける。放っとくとファイルはどんどん大きくなる
>>2
それを古い順に回して、一定の数だけ残すのが logrotate。cron.daily か logrotate.timer(OnCalendar=daily)で毎日動いて、設定に合ったものだけ回す
>>3
設定はどこ?
>>4
全体の設定が /etc/logrotate.conf、パッケージごとの設定が /etc/logrotate.d/ の下。Debian の logrotate.conf はweeklyrotate 4createinclude /etc/logrotate.d
で、毎週回して4世代残し、回した後に空のファイルを作る
>>5
logrotate.d の rsyslog の中身は?
>>6
対象のファイル(syslog、auth.log など)を並べて、{ } の中にrotate 4、weekly、missingok、notifempty、compress、delaycompress、sharedscriptspostrotate 〜 endscript の間に rsyslog に知らせるスクリプト
>>7
それぞれの意味は?
>>8
rotate N:N 世代残す
daily・weekly・monthly:回す間隔。size 100M なら大きさで
missingok:ファイルがなくてもエラーにしない
notifempty:空なら回さない
compress:古いのを gzip で圧縮
delaycompress:1つ前(.1)だけは圧縮せずに、次に回すときに圧縮する
create 0640:回した後に、その権限で新しいファイルを作る
>>9
delaycompress がさっきの答えか。書きかけのプログラムがまだ .1 に書いてることがあるから、すぐには圧縮しない
>>9
postrotate は何のため?
>>11
プログラムは開いたファイルに書き続けるから、名前を変えただけやと古いほう(.1)に書き続ける。postrotate でプログラムに「ファイルを開き直して」と知らせる(HUP のシグナルや reload)
sharedscripts を付けると、ファイルが何個あってもスクリプトは1回だけ
>>12
開き直せないプログラムには copytruncate(コピーしてから元を空にする)。コピーの間に書かれた分はなくなることがある
実際に動くところを見てみたい
>>14
/workspace の下に app.log と設定ファイル(rotate 3、daily、compress、delaycompress、notifempty、create 0640、postrotate で印を書く)を作って、状態ファイルも -s で作業用の場所にして -f(強制)で5回回した
>>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-----
>>16
残るのは今の1つと古い3つ。ディスクに置かれるのは
ファイル
>>15
設定を試すだけで回したくないときは?
>>18logrotate -d 設定ファイル。デバッグモードで、何をするかを表示するだけで何もしない(試したら、その旨の warning も出た)。-v は動かしながら詳しく表示
>>18
どこまで回したかは状態ファイル(Debian は /var/lib/logrotate/status)に残ってて、daily でも1日たってないと回さない。-f はそれを無視して回す
>>2
journald のログも logrotate で回すん?
>>21
回さない。journald は SystemMaxUse= などで自分で古いのを消す。logrotate はテキストのログファイル用
>>9
rotate で世代、daily などで間隔、compress と delaycompress で .1 だけ生、postrotate で開き直させる、試すときは -d。syslog.1 の謎が解けた
管理人のひとこと
- logrotate はログを回して一定の世代だけ残す。cron.daily か logrotate.timer で毎日動く。全体は /etc/logrotate.conf、個別は /etc/logrotate.d/(include で読み込む)。
- 主な指定:rotate N(世代数)、daily・weekly・monthly・size、missingok、notifempty、compress(gzip)、delaycompress(.1 は圧縮しない)、create 権限、copytruncate。
- postrotate 〜 endscript で回した後にプログラムにファイルを開き直させる。sharedscripts で1回だけ実行。
logrotate -dは表示だけで何もしない(-v は詳しく、-f は強制)。状態は /var/lib/logrotate/status など。journald のログは対象外。