Wenn Sie nicht in einer Webanwendung ausgeführt werden, wie kann Log4j2 dann ordnungsgemäß heruntergefahren werden? Ich sehe nur einen noop LogManager.shutdown ()
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.
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.
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.
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: Ссылка
Tags und Links java logging log4j log4j2 application-shutdown