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の設定がうまくいかない場合は、関連記事も参考にしてみてください。
[PR]【早い者勝ち!】 .com/.net/.jp ドメイン取るならお名前.com
[PR]高速・定額・低料金のイー・モバイル!
関連記事
logrotateでログファイルがローテーションされない事への対処
logrotateでローテーションされるファイル名を変更する
chkconfigに登録されていないデーモンのランレベルをいきなり変えてはいけない
[お名前.com] サービスを構築するまでに行ったサーバー設定作業もろもろ
不要なファイルやディレクトリを削除できる「tmpwatch」コマンド
inotifyを使ってファイルやディレクトリに起きたイベントを簡単に監視する