Ich habe iptables verwendet, um Informationen zu Verbindungen zu speichern, indem ich die /etc/syslog.conf
Datei 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.log
Datei.
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.1
mit sed vornimmt. - Beim nächsten Drehen wird diese Datei
access.log.2
mit all Ihren Änderungen in umbenannt. - Das neueste
access.log
wird in umbenanntaccess.log.1
, was dann von sed geändert werden kann. - Es wird etwas Neues
access.log
erstellt, usw. usw....