破棄されたブログ

このブログは破棄されました。

logrotate(8) の create と su ディレクティブについて

TL;DR

create ディレクティブで指定したユーザ・グループで空のログが生成されない時は、 su ディレクティブも指定する。

また、ログの出力方法に logger(1) と syslog を用いることを検討する。

原因

logrotate(8) の man ページでは、 su ディレクティブについて次のように説明されている。

su user group

デフォルトのユーザ・グループの代わりに(だいたい root)、指定したユーザ・グループでログファイルをローテートする。 user にはローテートするユーザ名を、 group にはローテートするグループ名を指定する。 ここで指定されたユーザ・グループが、create ディレクティブで指定されたファイルを作成する権限がない場合、エラーを発生する。

注意が必要なのは、権限がないユーザに root が含まれる点で、どうせ root が実行するんだから問答無用で動くだろう思っているとエラーを吐いてくる。

error: skipping "/path/to/sushi.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.

指定したユーザ・グループで空ファイルが生成されない現象は、これが原因と考えられる。

そもそも論

ログファイルの書き込み権限を何かしらのプロセスの実行ユーザが持っているのは、よろしくないんじゃないと思う。 logger(1) とかを使って syslog 経由でログを吐くようにしたほうがいい。