Die Suche in der Datei iptables.log dauert lange

Die Suche in der Datei iptables.log dauert lange

Ich habe iptables verwendet, um Informationen zu Verbindungen zu speichern, indem ich die /etc/syslog.confDatei so geändert habe, dass die Informationen in gespeichert werden /var/log/iptables.log.

Ich muss also alle X Stunden Informationen aus der Protokolldatei extrahieren. Das Problem ist jedoch, dass die Datei dadurch größer und die Suche langsamer wird. Daher habe ich Folgendes verwendet:

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

Um zu löschen, was ich nicht mehr brauche. Aber wenn ich diesen Befehl verwende, stoppt iptables das Speichern von Daten in der iptables.logDatei.

Also, was ist falsch? Wie kann ich dieses Problem lösen?

Antwort1

versuchen Sie vielleicht ein

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

damit Sie die Datei während des sed nicht sperren

bei großen Dateien ist die Leistung von sed schlecht, also versuchen Sie zuerst, die Datei zu greppen oder (was ich mache) behalten Sie einen Marker/Index bei, sodass Sie von diesem aus weitermachen und nur das Ende der Datei behandeln (auch mit einer temporären Kopie, wenn die Behandlung aufwändig ist).

Sie könnten sed -u verwenden, um als Stream zu arbeiten und Pufferprobleme bei großen Dateien zu vermeiden

Antwort2

Ich nehme an, Sie verwenden Syslog. Und ich gehe davon aus, dass die direkte Bearbeitung durch sed tatsächlich eine neue Datei erstellt und die alte entfernt.

Syslog ist sehr fragil, wenn Sie die Logdateien rotieren/neu erstellen, ohne es zu benachrichtigen. Was Sie sehen, ist genau das, was passiert: Syslog protokolliert nichts in die Datei, obwohl sie existiert. Das liegt daran, dass Syslog immer noch den alten Datei-Handle hat und in die alte Datei schreibt (obwohl Sie ihn mit ls usw. nicht mehr sehen können). Sobald Syslog diesen Datei-Handle schließt, verschwinden die Daten im Nirvana.

Ich würde wie devnull empfehlen, stattdessen logrotate zu verwenden. Wenn Sie das nicht möchten, führen Sie nach Ihrem Sed-Aufruf ein Syslog-Reload durch oder starten Sie neu. Das sollte hoffentlich funktionieren.

Antwort3

Verwenden Sie logrotate. Normalerweise rotieren Sie jede Nacht oder jede Woche, aber Sie können dies nach Bedarf ändern. Der einzige Haken ist, dass dies bedeuten könnte, dass iptables nach der Rotation neu gestartet werden muss, was von logrotate erledigt wird. Ich weiß nicht, ob das nötig ist, oder ob das (oder die Häufigkeit) ein Problem für Sie oder Ihre Anwendung darstellt.

Logrotate erstellt eine neue Logdatei und benennt die alten um. Sie können sie alle behalten oder sie nach einer Weile automatisch löschen. Die rotierte(n) Datei(en) können problemlos geändert werden, da sie nicht mehr zum Loggen verwendet werden.

  • Angenommen, Sie haben eine Protokolldatei access.log.
  • Logrotate benennt dies normalerweise in um access.log-20140729.
  • Anstelle eines Datums können Sie eine Zahl verwenden: access.log.1.
  • Sie können ein anderes Cronscript ausführen, das Änderungen access.log.1mit sed vornimmt.
  • Beim nächsten Drehen wird diese Datei access.log.2mit all Ihren Änderungen in umbenannt.
  • Das neueste access.logwird in umbenannt access.log.1, was dann von sed geändert werden kann.
  • Es wird etwas Neues access.logerstellt, usw. usw....

verwandte Informationen