applicationは同じopen file descriptorへ書き続け、signalでlogをreopenできない。
短い競合windowを許容し、active fileをcopy後にtruncateする。
適切なlogrotate directiveはどれか。
copytruncateはprocessにreopenさせず同じfileへ書き続けさせられるが、copyとtruncateの間にmessageを失う可能性がある。
詳細解説
createrename後に新fileを作るがprocessが古いdescriptorへ書き続け得る。
誤り。createは新fileを作るが、reopenしないprocessはrename済みの古いinodeへ書き続ける。
delaycompress直前世代の圧縮を1回遅らせる。
誤り。delaycompressはprocessが直前世代を開き続ける場合の圧縮遅延に役立つが、active descriptorを元pathへ戻さない。
missingok対象fileがなくてもerrorにしない。
誤り。missingokは対象file不在時の扱いだけで、open descriptorとrotation方法を変えない。
copytruncateactive logをcopyして同じfileをtruncateしdescriptorを維持する。
正しい。copytruncateは内容を世代fileへcopy後、同じactive inodeをtruncateするためprocessのdescriptorを維持できる。
実際に確かめる
一時的な検証環境で実行できる例です。
logrotate --help 2>&1 | head -n 5期待される結果
logrotateのusage/help(導入環境)理解のポイント
- descriptorを維持
- copy後truncate
- 競合による欠落risk
確認時の注意
- 確認環境: logrotate helpの読取のみ
- 実fileをrotateせずhelpだけを検証する。
基礎のおさらい
data loss window
copy中にもprocessは書けるため、copy済み位置とtruncateの間に追加されたmessageが失われる可能性がある。
reopen方式
daemonがsignalでreopenできるならrename/create後にpostrotateでreopenさせる方が、copytruncateの競合を避けやすい。