web-dev-qa-db-ja.com

Linuxは、変更されたログのみを毎日収集します

Linuxは変更されたログを毎日収集します

毎日/var/log/ディレクトリからログファイルを収集したい。

私のスクリプトは、ディレクトリ内のすべてのファイルを圧縮して個別に保存します。しかし、問題は、すべてのログファイルが毎日圧縮され、サイズが増え続けることです。

したがって、変更されたファイルのみ(変更されたコンテンツのみ)を毎日Zipする方法。

特定の時点の後にファイルの変更されたコンテンツを取得する方法。つまり、初めてログ全体を収集できます。

翌日以降は、当日のログのみを収集する必要があります。

翌日...

..。

1
Ram

これを行う簡単な方法は、ニーズを満たす場合、毎日ローテーションされる特定のログファイルを用意することです。まず、/etc/(r)syslog.confに追加します。ログに記録した後に何かを破棄するルールがある場合は、おそらく上部近くに追加します。

*.*           -/var/log/daily.log

これはallメッセージを受信します。つまり、他のログにあるものはすべてこのログに含まれます。

次に、cronを介して実行できるスクリプトが必要です。これにはlogrotateを使用できますが、この場合はあまり意味がありません。

#!/bin/sh

gzip /var/log/daily.log
# Do whatever with the gzipped file
touch /var/log/daily.log
kill -s HUP `pidof syslogd`   # see below

この最後のステップはsyslogdを再起動するために必要なので、新しい/var/log/daily.logを再度開きます。そうしないと、後で何も表示されません。 rsyslogを使用している場合は、代わりにpidof rsyslogdを使用してください。 pidofを最初に試してテストします。

最後に、/etc/crontabで:

0 0  * * *  root   /path/to/rotationscript

毎日深夜にこれを行います。

2
goldilocks

logrotate の使用を検討しましたか?

Logrotateは、スケジュールされた間隔でログファイルをローテーションするためのユーティリティです。インストール後、次のようなセクションで構成します。

/var/log/*.log /var/log/auth /var/log/messages {
 daily
 rotate 5
 copytruncate
 compress
 dateext
}

インストール時に、パッケージマネージャーはすでに/etc/cron.dailyに追加しているはずなので、他に何もする必要はありません。

これにより、/var/log/auth.20140420.gzなどのログが作成されます。それらを収集したい場合は、.gzファイルを探すだけです。

重要な注意事項:

私の例では、元の質問で/var/log/*のすべてのログをローテーションしたいと言っていても、意図的に/var/logを実行しませんでした。これは、utmpwtmpなどの/var/logに、通常のログファイルではなく、ローテーションしてはならないものがあるためです。

ログをローテーションする方法は2つあります。ログの名前を変更してから、ログを書き込むプログラムにログファイルを再度開くように指示するか、ログファイルの内容を新しい名前にコピーしてから元の名前を切り捨てることができます。
move方式の方が優れていますが、一部のアプリにはログを再度開くように通知する方法がないため、コピー/切り捨ての方が安全です。
copytruncateオプションは、この動作を制御するオプションです。 moveメソッドを使用する場合は、それを削除して、postrotateセクションに配置します(マニュアルページを参照)。

1
Patrick