右往左往ブログ

日々よりみち

logrotateでcreate時にパーミッションが効かない

/etc/logrotate.d/ 配下でログローテートの設定を行ったときに、ローテートが実行されてもどうしてもパーミッション設定が変わらないことがありました。以下のような設定をしていたときです。

/etc/logrotate.d/sample

/var/log/hoge.log {
      daily
      rotate 7
      missingok
      copytruncate
      create 644 root root
}

もともと、対象のログのパーミッション640だったものを、ログローテート時に644にうまく変更してくれることを期待していました。 しかし、実際にはローテートしたとしても、パーミッションは変わりません。640で作成されたなら、640のままです。どうしても設定が効かずに、ならなぜcreateみたいな設定があるのだろうか?と疑問に思いました。

原因は、設定の競合でした。

  • copytruncate : ファイル自体を消さずに、中身をコピーして元ファイルの中身を消す
  • create : ファイルが存在しなければ作る

ということで、そもそもcreateは、ファイルをなければ作るのであって、既に存在するファイルのパーミッションを変更するものではないのでした。一方でcopytruncateは、ファイルの存在自体を消さないので、いつまでも当初のパーミッションのままファイル自体は存在し続けます。

従って、ログローテート対象のログのパーミッションを変更するには、以下のようにするしかなさそうです。

  • logrotateのオプションでcopytruncateをやめる
  • そもそもchmodなどでログのパーミッションを変更する

そもそも、ミドルウェアがローテート後のログを見続ける問題があるので、copytruncateを入れているのであれば、「あえて」入れている場合がほとんどだと思います。

ということで、素直に後者で対応しましょう、という話でした。