logrotateでエラーが出た場合の対処方法

logroateで自身が設定したローテートファイルに問題があり、エラーとなった場合の対処方法を紹介します。

管理者宛てに届いたlogrotateに関するエラーメール

管理者宛てに以下のようなメールが届きました。

件名:
Anacron job ‘cron.daily’ on hoge.dassyi.com

本文:
/etc/cron.daily/logrotate:error: skipping “home/user001/php-fpm/log*log” because parent directory has insecure permissions (It’s world writable or writable by group which is not “root”) Set “su” directive in config file to tell logrotate which user/group should be used for rotation.

エラーの原因と対処方法

エラーの原因は、個別に設定したphp-fpmのログのローテートディレクトリのパーミッションに問題があるとの事。(php-fpmの設定についてはこちらを参照ください)

当初 自分で作成した log ディレクトリのパーミッションは、770で作成していました。

どうも、このパーミッションだと安全とみなされず、ローテートができないとの事で(ログディレクトリに777を設定する人はいないと思いますが、777もダメ)、対処方法の一つは、750に変更するとエラーがなくなります。

対処方法はもう一つあり、logroateファイルで、su を使用して設定すれば良いとの事です。こちらは、もともと存在するlogrotateファイルにディレクトリのパスを追加しただで、わざわざsuを記載したローテートファイルを別途作成するのも手間なので、前者を選択しました。(必要に応じてご対応ください)

logrotateの空実行の方法

ログローテートには実際にローテートさせずに、空振りで実行させるオプションがあります。私のようにメールでたまたま通知されたから気が付くケースもあるので、logrotateファイルを変更した際は、可能な限り下記のコマンドを実行して、エラーが出ないか確認しましょう。(下記の例は、php-fpmを指定した場合)

実際にエラーが出た際の表示は以下の通りでした。

WARNING: logrotate in debug mode does nothing except printing debug messages!  Consider using verbose mode (-v) instead if this is not what you want.

reading config file /etc/logrotate.d/php-fpm
Reading state from file: /var/lib/logrotate/logrotate.status
Allocating hash table for state file, size 64 entries
Creating new state
(略)
Creating new state

Handling 1 logs

rotating pattern: /home/user001/php-fpm/log/*log
/var/log/php-fpm/*log  1048576 bytes (no old logs will be kept)
empty log files are not rotated, old logs are removed
considering log /home/user001/php-fpm/log/*log
error: skipping "/home/user001/php-fpm/log/*log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
considering log /var/log/php-fpm/error.log
  Now: 2024-04-18 08:36
  Last rotated at 2024-04-15 18:00
  log does not need rotating (log size is below the 'size' threshold)
considering log /var/log/php-fpm/www-error.log
  Now: 2024-04-18 08:36
  Last rotated at 2024-04-15 18:00
  log does not need rotating (log size is below the 'size' threshold)

次にパーミッションを750に修正して、実行した結果を掲載します。

WARNING: logrotate in debug mode does nothing except printing debug messages!  Consider using verbose mode (-v) instead if this is not what you want.

reading config file /etc/logrotate.d/php-fpm
Reading state from file: /var/lib/logrotate/logrotate.status
Allocating hash table for state file, size 64 entries
Creating new state
(略)
Creating new state

Handling 1 logs

rotating pattern: /home/user001/php-fpm/log/*log
/var/log/php-fpm/*log  1048576 bytes (no old logs will be kept)
empty log files are not rotated, old logs are removed
considering log /home/user001/php-fpm/log/*log
  log /home/user001/php-fpm/log/*log does not exist -- skipping
considering log /var/log/php-fpm/error.log
  Now: 2024-04-18 08:41
  Last rotated at 2024-04-15 18:00
  log does not need rotating (log size is below the 'size' threshold)
considering log /var/log/php-fpm/www-error.log
  Now: 2024-04-18 08:41
  Last rotated at 2024-04-15 18:00
  log does not need rotating (log size is below the 'size' threshold)
not running postrotate script, since no logs were rotated

メールでも通知されていたメッセージが消えていることがわかります。

動作確認の重要さがわかる事例となりました。logrotate -d コマンドをしっかり覚えておきましょう。

今回はここまでです。最後までお読みいただきありがとうございました。