iptables.log ファイルの検索に時間がかかります

iptables.log ファイルの検索に時間がかかります

/etc/syslog.conf私は、情報を に保存するようにファイルを変更することで、iptables を使用して接続に関する情報を保存しました/var/log/iptables.log

つまり、X 時間ごとにログ ファイルから情報を抽出する必要があります。ただし、問題はファイルが大きくなり、検索が遅くなることです。そこで、次のコードを使用しました。

sed -i '/string/d' iptables.log

不要になったものを削除するためです。ただし、このコマンドを使用すると、iptables はファイルへのデータの保存を停止しますiptables.log

それで、何が問題なのですか? この問題はどのように解決できますか?

答え1

試してみると

cat iptables.log | sed -n "/PatternYouLookat/ p"

sed中にファイルをロックしないようにする

大きなファイルの場合、sed のパフォーマンスは低いため、最初にファイルを grep するか、(私が行っているように) マーカー/インデックスを保持して、そこから末尾を取得し、ファイルの末尾のみを処理するようにします (処理が重い場合は、一時コピーを使用する場合もあります)。

sed -uを使用してストリームとして動作させ、巨大なファイルでのバッファの問題を回避することができます。

答え2

syslog を使用していると思います。また、sed インプレース編集では実際に新しいファイルが作成され、古いファイルが削除されると想定しています。

Syslog は、通知せずにログファイルをローテーション/再作成すると非常に脆弱になります。表示される内容は、まさに何が起こるかです。ファイルが存在するにもかかわらず、syslog は何もログに記録しません。これは、syslog がまだ古いファイル ハンドルを保持しており、古いファイルに書き込むためです (ls などで表示できなくなっても)。syslog がこのファイル ハンドルを閉じるとすぐに、データは完全に消えてしまいます。

代わりに devnull のように logrotate を使用することをお勧めします。望まない場合は、sed 呼び出し後に syslog reload または restart を発行してください。これでうまくいくはずです。

答え3

logrotate を使用します。通常は毎晩または毎週ローテーションしますが、必要に応じて変更できます。唯一の問題は、ローテーション後に iptables を再起動する必要がある可能性があるということです。これは logrotate によって処理されます。それが必要なのかどうか、またそれが (または頻度が) あなたやあなたのアプリケーションにとって問題になるのかどうかはわかりません。

Logrotate は新しいログファイルを作成し、古いログファイルの名前を変更します。それらをすべて保持することも、しばらくしてから自動的に削除することもできます。ローテーションされたファイルは、ログ記録には使用されないため、問題なく変更できます。

  • ログファイルがあるとしますaccess.log
  • Logrotate は通常、これを に名前変更しますaccess.log-20140729
  • 日付の代わりに数値を使用することもできます: access.log.1
  • sed を使用して変更する別の cronscript を実行できますaccess.log.1
  • 次回の回転時に、このファイルはaccess.log.2すべての変更を反映して に名前が変更されます。
  • 最新のものaccess.logは に名前が変更されaccess.log.1、その後 sed で変更できるようになります。
  • 新しいものaccess.logが作成され、などなど...

関連情報