誰かが私に「アプリケーションのログを保持する期間」を尋ねたところ、領域が不足する以外にそれらを破棄する理由がないため、私の答えは「ディスクがいっぱいになるまで」でした。
ただし、標準のlogrotateでは、特定の期間+ローテーション数を指定する必要があります。「毎日ローテーションし、空き容量が5%になるまで好きなだけ履歴を保持する」と言えるようなものはありますか?
プラットフォームはRedhat Linuxです。
誰かが私に「アプリケーションのログを保持する期間」を尋ねたところ、領域が不足する以外にそれらを破棄する理由がないため、私の答えは「ディスクがいっぱいになるまで」でした。
ただし、標準のlogrotateでは、特定の期間+ローテーション数を指定する必要があります。「毎日ローテーションし、空き容量が5%になるまで好きなだけ履歴を保持する」と言えるようなものはありますか?
プラットフォームはRedhat Linuxです。
回答:
おそらくfirstactionまたはlastactionディレクティブを使用して、ディスクの空き容量をテストするシェルスクリプトを呼び出し、最も古いファイルに対して削除を実行できます。
firstaction/endscript
The lines between firstaction and endscript (both of which must appear on lines by themselves) are
executed (using /bin/sh) once before all log files that match the wildcarded pattern are rotated,
before prerotate script is run and only if at least one log will actually be rotated. These
directives may only appear inside a log file definition. Whole pattern is passed to the script as
first argument. If the script exits with error, no further processing is done. See also lastac-
tion.
更新:
実行できるスクリプトのタイプに関するStackoverflowの投稿は次のとおりです。
logrotate自体にはそのようなオプションはありません。空き容量が基準を下回ったときに削除する最も古いログを見つけるcronスクリプトを追加できます。他の検証も行うことができます。ただし、システムが大きな一時ファイルを作成できず、アプリケーション障害が発生する可能性があるため、ディスクを常にいっぱいにしすぎることはお勧めできません。
@cjcが示唆するように、firstactionを使用できます。この例を見てください:
/mnt/user/logs/*.log /mnt/user/logs/*/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
su root www-data
create 760 root www-data
firstaction
for file in `find -type f -size +1024M`; do
percent=`df -h | grep /mnt/user | awk '{print $5}' | sed 's/%//'`
if [ $percent -gt 50 ]; then
echo "Removed $file" >> /mnt/user/logs/logrotate.log
rm $file
fi
done;
endscript
}
この例では、使用済みパーティションのスペースが50%を超えている場合、/ mnt / userパーティションから1GBを超えるファイルを削除しました。