iptables.logファイルの検索に時間がかかる

iptables.logファイルの検索に時間がかかる

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

したがって、X時間ごとにログファイルから情報を抽出する必要があります。しかし、問題はファイルが大きくなり、検索が遅くなることです。だから私は以下を使用しました。

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

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

それでは、何が間違っていますか?この問題をどのように解決できますか?

答え1

たぶん試してみてください

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

これにより、sed中にファイルをロックしません。

大容量ファイルの場合、sed パフォーマンスが低いため、ファイルを最初に greping するか、マーカー/インデックスを維持してこのファイルから尾部分を削除し、ファイルの尾部分のみを処理できるようにします (一時コピーがあってもスループットが多い場合) 。

sed -u を使用してストリームを操作し、大容量ファイルの一部のバッファの問題を回避できます

答え2

syslogを使用しているようです。 sed 内部編集が実際に新しいファイルを生成し、古いファイルを削除すると仮定します。

通知なしでログファイルを回転/再生すると、Syslogは非常に脆弱です。あなたが見ているのは、まさに何が起こっているのかです。ファイルが存在しても、syslogはファイルに何も記録しません。これは、syslogがまだ古いファイルハンドルを持っていて古いファイルに書き込んでいるためです(lsのようなコマンドを使用するとこれ以上表示されませんが)。 syslogがファイルハンドルを閉じると、データは消えます。

代わりに、devnullのようなlogrotateを使用することをお勧めします。不要な場合は、syslogの再ロードを実行するか、sed呼び出し後に再起動してください。これはトリックを行う必要があります。

答え3

ログ回転を使用します。通常、夜または毎週回転しますが、必要な値に変更できます。唯一の問題は、これがログロテートによって処理される回転後にiptablesを再起動する必要があることを意味できることです。これが必要かどうか、またはこれが(または頻度)があなたまたはあなたのアプリケーションに問題かどうかはわかりません。

Logrotateは新しいログファイルを生成し、古いログファイルの名前を変更します。すべてアーカイブするか、一定期間が経過すると自動的に削除できます。回転したファイルはログ記録には使用されなくなり、問題なく変更できます。

  • ログファイルがあるとしましょうaccess.log
  • Logrotateは通常名前をaccess.log-20140729
  • 日付の代わりに数字を使用できますaccess.log.1
  • sed変更を使用して他のcronscriptを実行できますaccess.log.1
  • 次の回転ではファイル名が変更され、access.log.2すべての変更が含まれます。
  • 最新の名前access.logは名前が変更され、access.log.1sedで変更できます。
  • 新しく作ったaccess.log等..

関連情報