Wie log4j2 ordnungsgemäß heruntergefahren wird

9

Wenn Sie nicht in einer Webanwendung ausgeführt werden, wie kann Log4j2 dann ordnungsgemäß heruntergefahren werden? Ich sehe nur einen noop LogManager.shutdown ()

    
user671731 16.09.2014, 19:40
quelle

3 Antworten

9

Es gibt keine öffentliche API dafür, aber Sie können

verwenden %Vor%

Wenn Sie Interesse daran haben, eine öffentliche API dafür zu haben, stimmen Sie bitte hier ab oder fügen Sie einen Kommentar hinzu: Ссылка

Aktualisierung:

In Log4j 2.5 können Sie Configurator.shutdown() aufrufen. Mit Log4j 2.6 können Sie LogManager.shutdown() aufrufen.

    
Remko Popma 17.09.2014 00:15
quelle
7

Erklärung und Geschichte hinter

Was Log4j 2 intern verwendet, nennt man ShutdownRegistrationStrategy . Es besteht aus einer Klasse, die einen oder mehrere Herunterfahr-Callbacks registriert, die zur richtigen Zeit aufgerufen werden. Sie bieten eine Schnittstelle namens ShutdownCallbackRegistry und ihre Standardimplementierung namens DefaultShutdownCallbackRegistry . Diese Implementierung registriert sich als Shutdown-Hook für die JVM mit Runtime.getRuntime().addShutdownHook() .

Nach einigen Problemen auf dem Log4j 2 Bug Tracker ( LOG4J2-868 und LOG4J2-658 ), wäre der richtige Weg, eine eigene Implementierung der ShutdownCallbackRegistry -Schnittstelle bereitzustellen. Da es keine öffentliche API gibt, um Log4j 2 herunterzufahren, ist dies die einzige echte und gültige Möglichkeit, dies zu archivieren.

Vorgeschlagene Lösung

Also, was ich getan habe, um das zu beheben, ist, dass ich meine eigene Version der ShutdownCallbackRegistry -Schnittstelle implementiert habe. Es macht meistens die gleichen Dinge wie die Standardimplementierung, aber anstatt sich selbst als Shutdown-Hook zu registrieren, wartet es, bis es manuell aufgerufen wird. Dies wird intern ermöglicht, indem die Instanz des Objekts in einem statischen Feld gehalten wird. Sie müssen dann nur eine einzige statische Methode aufrufen, um die Shutdown-Prozedur zu starten. Deshalb habe ich sie als StaticShutdownCallbackRegistry .

Sie können die vollständige Lösung und die Anweisungen auf GitHub / DjDCH / Log4j-StaticShutdown finden und in Ihren eigenen Projekten verwenden . Am Ende müssen Sie nur so etwas in Ihrer Anwendung tun:

%Vor%

Ich kann nicht ohne Zweifel sagen, dass dies die perfekte Lösung ist und dass meine Implementierung perfekt ist, aber ich habe versucht, es richtig zu machen (gemäß der nicht existierenden Dokumentation darüber). Ich freue mich über Feedback von Ihnen, entweder wenn Sie diese Lösung passend finden oder nicht.

    
DjDCH 03.03.2015 15:19
quelle
6

Log4j-Web -Bibliothek ist die bevorzugte Methode, um Ressourcen in der Webanwendung ordnungsgemäß zu bereinigen.

Um es zu aktivieren, fügen Sie eine solche Abhängigkeit zu Ihrer pom.xml

hinzu %Vor%

Es funktioniert in der Servlet 3. * Umgebung "out-of-the-box". Wenn Sie ältere Servlet-Spezifikationen verwenden, finden Sie hier Informationen darüber, wie Sie die ordnungsgemäße Reinigung von log4j2 aktivieren können: Ссылка

    
leokom 13.10.2015 09:01
quelle