web-dev-qa-db-ja.com

Linuxでの空き領域駆動のログローテーション?

誰かが「アプリケーションのログをどのくらいの期間保持する必要があるか」と尋ねたところ、スペースが不足する以外にログを破棄する理由がないため、「ディスクがいっぱいになるまで」と答えました。

ただし、標準のlogrotateでは、特定の期間+ローテーション数を指定する必要があります。 「毎日ローテーションし、空き容量が5%になるまで、好きなだけ履歴を保持する」と言えるようなものはありますか?

プラットフォームはRedhatLinuxです。

8
kdt

おそらく、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の投稿は次のとおりです。

https://stackoverflow.com/questions/7523059/remove-oldest-file-in-repository

9
cjc

logrotate自体にはそのようなオプションはありません。空き領域が基準を下回ったときに削除する最も古いログを見つけるcronスクリプトを追加できます。他の検証も行うことができます。ただし、システムが大きな一時ファイルを作成できず、アプリケーションの障害を引き起こす可能性があるため、ディスクを常にいっぱいにしすぎることはお勧めできません。

1
johnshen64

利用可能なすべてのディスク領域をログでいっぱいにしたくない場合があることを指摘したいと思います。シンプロビジョニングされた/ varディレクトリを持ついくつかのホストを扱ってきましたが、ログを特定のサイズに保つことが重要でした。サイズを抑えるために、logrorateと組み合わせてcroniesジョブを使用しました。ご使用の環境でも同様のものを使用できますが、splunkやsyslog-ngなどの中央ログサーバーの方がおそらく適切なオプションです。

0
Tim Brigham

@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より大きいファイルを削除しました。

0
esguti