前置き
logrotate設定できたはずやのに動かんor今まで動いてたのに動かなくなったってハマった人の助けになればと思って書いています。
logrotate、たまにしか触らないので挙動を忘れて思い出すのに困りますよね。。。
備忘録も兼ねて引っかかったポイントとそれに伴って問題点を見つける方法をメモしておこうと思います。
そもそもdry-runをしましょう
動かない時はとにもかくにもdry-runしてデバッグしましょう。ログをみれば大抵のことがわかります。
ありがちなミスを挙げるとすると
- ファイルのパーミッションの問題
- 親ディレクトリのパーミッションの問題(この記事が参考になります。)
- そもそもローテーション対象パスをtypo...
こんなもんでしょうか。
あと、個別設定ファイルを実行してうまくいっても、/etc/logrotate.conf
にdateext
とかデフォルト値と違っていてなおかつ個別設定ファイル上で記述していないグローバルな設定が書いてあると挙動がかわってきます。
最終テストはlogrotate -d /etc/logrotate.conf
でやっとくべきです。これで私が今回やられました。
ローテション対象ログの存在するディレクトリにあるファイル名に気をつけよう
この記事を書いたきっかけです。logrotate.conf
だけにdateext
(ローテーション時にファイル末尾に日付をつけてくれる)が書いてあることと、古いファイルがよくない名前で置いてあったのが原因でした。
実例
設定
-
logrotate.conf
にはdateext
の記述あり。 -
HOGE
を管理するlogrotate.d/HOGE
にはdateext
の記述なし。さらにdelaycompress
の記述あり。
HOGE.log
HOGE.log-20200602
HOGE.log-20220602.gz
というファイルだけが同一ディレクトリ上にあるとしましょう。
このHOGEというファイルに関するlogrotate.d
以下の設定ファイルにはdateext
が書いていませんが、親設定ファイルであるlogrotate.conf
には書いてありました。
なのでlogrotateはHOGE.log-YYYYMMDD
というフォーマットのファイルを世代管理対象とします。
またdelaycompress
があるので一世代前は圧縮しません。
そのためlogrotateはたまたま一世代前にあたるHOGE.log-20200602
というファイルを圧縮しようとします。もちろんこのファイルはlogrotateが管理して作成したものではないです。
しかし、既にHOGE.log-20220602.gz
があるため作成に失敗するということが発生します。
つまり、logrotateが作ろうとしているファイルと同じ名前のファイルが既にあるとlogrotateは動作をやめてしまいます。
(間違って置いたログファイルを上書きされては困るので安全な動作ですね。)
ちなみにlogrotate.d/HOGE
だけでdry-runしたときはdateext
が効きません。
つまりHOGE.log.1
という名前で世代管理をしようとするのでローテーションに成功します。
この組み合わせで私は混乱してしまいました。
おそらくログの置いてあるディレクトリ上で以前だれかがログファイルを解凍してそのまま放置していたせいでこの現象がおきてしまったのでしょう。。。涙
結論
ログの置いてあるディレクトリ上でファイルを解凍して作業をしないように、、、。
.gz
ならzcat
とless
を組み合わせて使ったりで対処しましょう。もしくはローカルにコピーして作業しましょう。
おまけ
今回、anacronで実行していたのでlogrotateの実行ログをリダイレクトしてファイルに実際本番で実行時の挙動を保存して確認しようと思ったら、logrotateのログは標準エラー出力で吐かれていました。(少しでも失敗したときだけなのかもしれませんが。)
もし毎回logrotateのログを保存したい場合はご注意を。