私は無期限に実行する必要があるデーモンプロセス(いわば「サービス」)を実行しており、その出力をログに記録したいと考えています。次のようなシンプルなソリューション:
./long-running-process > log.out &
...ファイルlog.out
として失敗:
emacs
やvi
などのテキストエディタで簡単に処理できるサイズをすぐに超えますログファイルのサイズを管理しやすくするために、split
bashコマンドを使用できます。
./long-running-process | split -l 30000
このソリューションは、作成するログファイルを管理可能なサイズに保ちますが、サフィックス(split: output file suffixes exhausted
)が不足する可能性があります。また、サフィックススペースが大きい場合は、ファイルシステムスペースを使い果たすこともあります。
そのため、各ログファイルのサイズを管理できる多数のログファイルを生成し、それらの間でローテーションして、要求される合計ディスク領域に上限があるソリューションを探しています。
そのようなソリューションはありますか、それともアプリケーションレベルで実装する必要がありますか?
ログをカットするには
Apacheプロジェクトには、入力パイプ経由で受け取った入力をローテーションするように設計された便利なコマンドrotatelogs
があります読み取り rotatelogsについて
次に、cronolog
より良い時間処理もあります。 Cronologウェブサイト
しかし、ローテーションも行う場合は、logrotateを検討する価値がありますが、logrotateには新しいログファイルをトリガーするメカニズムが必要です(シグナルを送信し、プログラムを再起動するなど)。 stdoutをログに記録していて、プロセスを再起動したくない場合は、ここにrotatelogs/cronologが入ります。
最近のほとんどのLinuxディストリビューションには、logrotate
というツールが含まれており、OSはこのツールを使用して/var/log
ディレクトリを維持します。あなたもそれを使うことができます。 cron
を介して開始されるため、特定の頻度でログをローテーションする場合は、少なくともその頻度で実行されるcronjobをセットアップする必要があります。
これにより、2つのファイルaccess.log
とerror.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
}
いいえ、これは必須ではありません。アプリケーションで必要な場合のみです。これにより、アプリケーションが現在のログファイル(たとえば、access.log
からaccess.log.1
に名前が変更された後)への書き込みを停止し、元の名前access.log
へのロギングを再開します。
/var/log/atop/atop.log {
missingok
weekly
rotate 4
notifempty
create 0600 root root
}
完全を期すために、copytruncate
のlogrotate
オプションについても触れておきます。
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.