/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
が作成され、などなど...