Linuxでのフリースペース主導のログローテーション?


8

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

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

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


1
ディスクがいっぱいになるまでログを保持することは、物理環境に適用できますが、ほとんどの場合仮想サーバーとクラウドに移行するため、コストを下げるためにファイルシステムのサイズは可能な限り小さくする必要があります。この場合、保持ポリシーの定義を回避することはできません。
jfg956 2012年

回答:


9

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

/programming/7523059/remove-oldest-file-in-repository


1

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


すべてが1つのファイルシステムにある場合、それは良い考えではないかもしれません。ただし、他の邪魔にならないように、私のログは独自のファイルシステムにあります。
kdt

ああ、そうだ、彼らがfsしか持っていない場合は、スクリプトでクリーニングを実行し、dh / fsとawkまたはcutを使って使用率を抽出するのが簡単になる。その数値に基づいて、execで検索を開始することができるrm。私はスクリプトを書かず、crontab自体に1行を挿入することがよくあります。
johnshen64

0

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


0

@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を超えるファイルを削除しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.