Wie erstelle ich einen Logrotate-freundlichen Dateischreiber in Java oder einer anderen Plattform?

8

Was sind die besten Vorgehensweisen für die Implementierung eines Dateischreibers / Loggers in Java, der mit logrotate kompatibel ist? Das Ziel wäre, dass logrotate für die gesamte Protokollverwaltung verwendet werden kann, anstatt die integrierte Rotation / Verwaltung einer Protokollierungs-API (Log4J usw.) zu verwenden.

Ich würde Interesse haben, Kommentare / Antworten für andere Entwicklungsplattformen außer Java zu hören.

    
nbeyer 28.06.2011, 21:17
quelle

2 Antworten

8

Sie müssen die Protokolldatei in Ihrer Anwendung nur regelmäßig schließen und erneut öffnen. Sie benötigen einen Handler, der die letzte Zeit hält. Der Handler sollte die Datei schließen und erneut öffnen, wenn (zB) seit dem letzten Schließen 20 Sekunden vergangen sind und der Protokolleintrag gerade geschrieben wird. Es sollte diese Überprüfung unmittelbar vor dem Schreiben des Protokolleintrags

vornehmen

Wenn Sie dies nicht tun, werden die Protokolle in die alte Datei geschrieben, auch wenn sie von logrotate (!) umbenannt wird (der Dateideskriptor bleibt gleich) und später verschwinden die Protokolleinträge, wenn das Protokoll komprimiert wird und entfernt (in solchen Fällen wird Java solche Protokolle still fallen lassen).

Das Schließen und erneute Öffnen des Protokolls (unter Verwendung des Dateinamens) stellt sicher, dass, wenn die Datei umbenannt wurde, eine neue erstellt wird. Das Schließen und erneute Öffnen der Datei bei jedem Schreiben des Protokolls ist ein Overkill, da das Öffnen einer Datei ein kostspieliger Vorgang ist.

    
Jarek Potiuk 28.06.2011 23:27
quelle
0

Ich habe mir einige andere Apps angesehen und anscheinend gibt es eine Option postrotate und eine copytruncate . Die copytruncate-Option ist einfacher, aber ich denke, dass sie weniger zuverlässig ist, da Puffer nicht geleert werden können (z. B. @ Jarek Potuiks Antwort) und selbst wenn dies der Fall ist, können Sie doppelte Einträge oder verlorene Einträge erhalten.

Nehmen wir an, Sie möchten die Option postrotate :

Mit der Option postrotate können Sie einen Befehl ausführen, um Ihrer Anwendung zu sagen, dass sie die Datei erneut öffnen soll (schließen und dann öffnen). Beim Öffnen und Schließen der Datei in Java würden Sie dies mit einem synchronisierten Block oder einer Art Sperre tun und natürlich alle Puffer leeren.

Nehmen wir an, Ihre App heißt myapp :

Sie hätten eine Datei in /etc/logrotate.d/myapp mit etwas wie:

%Vor%

Der Befehl /etc/init.d/myapp rotate-logs müsste der App signalisieren, die Protokolldateien zu schließen und erneut zu öffnen.

Der Signalisierungsteil ist ziemlich kompliziert und hängt davon ab, welche Art von App Sie haben, da Java IPC nicht so gut unterstützt (dh Unix-Signale), so dass Sie möglicherweise einen Port öffnen oder einen vorhandenen Port wie 8080 verwenden müssen HTTP-REST-Befehl im Falle eines Servlet-Containers), um Ihrer App mitzuteilen, dass sie die Protokolldateien schließen und erneut öffnen soll.

    
Adam Gent 31.01.2017 17:03
quelle

Tags und Links