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を指定した場合)
# logrotate -d /etc/logrotate.d/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 コマンドをしっかり覚えておきましょう。
今回はここまでです。最後までお読みいただきありがとうございました。