logrotateでログファイルの保存世代数が意図しない設定に上書きされてしまった件 | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

logrotateの設定を変更してしばらく運用していたら、本来保存したい世代数とは異なって動いていることに気がつきました。

設定を見直しても正しいように見えて結構はまったのでメモしておきます。



logrotateの個々の設定ファイル内の定義場所に注意


答えは、logrotate.dの下に保存する個々のログファイルの設定の記述方法に誤りがありました。

デフォルトのlogrotateの設定は、/etc/logrotate.confに以下のような感じで書いていきます。


# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 8

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
compress

この設定は、特定のログファイルに適用するのではなく、logrotate全体の設定になっています。

これらの設定を変更したい場合は、logrotate.d以下の個々のログファイルの中で設定を上書きしていきます。


/var/log/httpd/*log {
    daily
    missingok
    notifempty
    sharedscripts
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}


上記の場合、毎週のログのローテーション(weekly)が、毎日(daily)となります。

記述する位置は、ローテーションさせたいログファイルのパスを{ }で囲みその中に書いていくのですが、うっかりその外に書いてしまうと、その他のログファイルへも適用されてしまいます。(構文エラーにはなりません)


daily
missingok
notifempty

/var/log/httpd/*log {
    sharedscripts
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}


上記のように書くと、httpdの設定ファイルが読込まれた以降のログファイルにおいて、ログローテーションのタイミング(daily)や、該当のログファイルがなかった場合でもローテーションしたり(missingok)、ログファイルが空の場合はローテーションしない(notifempty)設定で動いてしまいます。


ログローテーションの設定ファイルの読み込み順は、アルファベット順のようです。

実際の設定ファイルの読み込み順を確認してみたい場合は、テストで実行してみるとわかります。


# logrotate -d /etc/logrotate.conf
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file acpid
reading config info for /var/log/acpid
reading config file apps
reading config info for /var/log/php.log
reading config info for /var/log/conman/*
olddir is now /var/log/conman.old/
reading config file cups
reading config info for /var/log/cups/*_log
reading config file httpd
reading config info for /var/log/httpd/*log
reading config file iscsiuiolog
reading config info for /var/log/iscsiuio.log
reading config file mgetty


先ほどの誤ったhttpdの設定ファイルの例をそのままにしておくと、それ以降に読込まれているiscsiuiologなどのログファイルが本来の設定とは違った動きをしてきます。

私の環境では、設定ファイルがaから始まるものであったため、それ以降全てのログファイルに影響を与えていました・・・。


実際にログがどのように動いているかは、やはりテストで実行してみればわかります。


# logrotate -d /etc/logrotate.conf
- snip -
rotating pattern: /var/log/httpd/*log  weekly (8 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/httpd/access_log
  log does not need rotating
considering log /var/log/httpd/error_log
  log does not need rotating
not running postrotate script, since no logs were rotated


上記の場合は、weeklyで保存世代数は8で動いています。

意図した設定とは違っているという場合は、どこかの設定ファイルの内容が影響して悪さをしているかもしれません。

そのほか、logrotateの設定がうまくいかない場合は、関連記事も参考にしてみてください。