web-dev-qa-db-ja.com

ログファイルをローテーションするソリューション

私は無期限に実行する必要があるデーモンプロセス(いわば「サービス」)を実行しており、その出力をログに記録したいと考えています。次のようなシンプルなソリューション:

./long-running-process > log.out &

...ファイルlog.outとして失敗:

  • emacsviなどのテキストエディタで簡単に処理できるサイズをすぐに超えます
  • ファイルシステムの空き容量を使い果たすリスクがあります。

ログファイルのサイズを管理しやすくするために、split bashコマンドを使用できます。

./long-running-process | split -l 30000

このソリューションは、作成するログファイルを管理可能なサイズに保ちますが、サフィックス(split: output file suffixes exhausted)が不足する可能性があります。また、サフィックススペースが大きい場合は、ファイルシステムスペースを使い果たすこともあります。

そのため、各ログファイルのサイズを管理できる多数のログファイルを生成し、それらの間でローテーションして、要求される合計ディスク領域に上限があるソリューションを探しています。

そのようなソリューションはありますか、それともアプリケーションレベルで実装する必要がありますか?

ログをカットするには

Apacheプロジェクトには、入力パイプ経由で受け取った入力をローテーションするように設計された便利なコマンドrotatelogsがあります読み取り rotatelogsについて

次に、cronologより良い時間処理もあります。 Cronologウェブサイト

しかし、ローテーションも行う場合は、logrotateを検討する価値がありますが、logrotateには新しいログファイルをトリガーするメカニズムが必要です(シグナルを送信し、プログラムを再起動するなど)。 stdoutをログに記録していて、プロセスを再起動したくない場合は、ここにrotatelogs/cronologが入ります。

7
X Tian

最近のほとんどのLinuxディストリビューションには、logrotateというツールが含まれており、OSはこのツールを使用して/var/logディレクトリを維持します。あなたもそれを使うことができます。 cronを介して開始されるため、特定の頻度でログをローテーションする場合は、少なくともその頻度で実行されるcronjobをセットアップする必要があります。

これにより、2つのファイルaccess.logerror.logがローテーションされ、最大で5(現在+ 4ローテーション)が維持されます。現在のログファイルを再配置した後、killall -HUP httpdは「ハングアップ」信号を実行中のデーモンに送信して、新しいログファイルの作成をトリガーし、この時点から元の名前のaccess.logおよびerror.logファイルへのロギングを開始します。このファイルは、サイズが100kを超える場合にもログファイルをローテーションします。

   "/var/log/httpd/access.log" /var/log/httpd/error.log {
       rotate 5
       mail [email protected]
       size 100k
       sharedscripts
       postrotate
           /usr/bin/killall -HUP httpd
       endscript
   }

これは、ディレクトリ/var/log/news/* montlyの下のログファイルをローテーションし、2(現在+ 1)を維持します。このルールセットは、ログを元の状態に維持しますが、デフォルトの動作である圧縮(.gz)は行いません。

   /var/log/news/* {
       monthly
       rotate 2
       olddir /var/log/news/old
       missingok
       postrotate
           kill -HUP `cat /var/run/inn.pid`
       endscript
       nocompress
   }

Kill -HUPを送信する必要がありますか?

いいえ、これは必須ではありません。アプリケーションで必要な場合のみです。これにより、アプリケーションが現在のログファイル(たとえば、access.logからaccess.log.1に名前が変更された後)への書き込みを停止し、元の名前access.logへのロギングを再開します。

/var/log/atop/atop.log {
    missingok
    weekly
    rotate 4 
    notifempty
    create 0600 root root
}

参考文献

5
slm

完全を期すために、copytruncatelogrotateオプションについても触れておきます。

   copytruncate
          Truncate the original log file to zero size in place after
          creating a copy, instead of moving the old log file and
          optionally creating a new one.  It can be used when some program
          cannot be told to close its logfile and thus might continue
          writing (appending) to the previous log file forever.
         Note that there  is  a  very small  time  slice  between  copying
          the  file  and truncating it, so some logging data might be lost.
          When this option is used, the *create* option will have no effect,
          as the old log file stays in place.
2
umläute