antwortete ich im Grunde nur die gleiche Frage und ich hart werde ich meine Antwort hier teilen. Ich ermutige Sie, die complete answer available here zu lesen. Ich werde versuchen, hier eine Zusammenfassung zu geben und meine Antwort dem aktuellen Kontext anzupassen.
In der ersten Version stellte Log4j eine API bereit, um die Abschaltprozedur manuell aufzurufen. Aus Gründen, die wir nicht kennen, it was removed from the second version. Nun, der richtige Weg, dies zu tun (gemäß der nicht existenten Dokumentation), ist es, eine eigene Implementierung der ShutdownCallbackRegistry
Schnittstelle bereitzustellen, die für das Herunterfahren verantwortlich ist.
vorgeschlagene Lösung
Was ich tat, um dieses Problem zu beheben, ist, dass ich meine eigene Version der ShutdownCallbackRegistry
Schnittstelle implementiert. Es macht meistens die gleichen Dinge wie die Standardimplementierung, aber anstatt sich selbst als Shutdown-Hook für die JVM zu registrieren, wartet es, bis es manuell aufgerufen wird.
Sie können die komplette Lösung und die Anweisungen auf GitHub/DjDCH/Log4j-StaticShutdown finden und in Ihren eigenen Projekten verwenden. Grundsätzlich am Ende haben Sie nur so etwas wie dies in Ihrer Anwendung zu tun:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
try {
// Do your usual shutdown stuff here that need logging
} finally {
// Shutdown Log4j 2 manually
StaticShutdownCallbackRegistry.invoke();
}
}
}));
ich nicht ohne Zweifel sagen, dass dies die perfekte Lösung ist und dass meine Implementierung ist perfekt, aber ich versuchte, um es richtig zu machen. Ich freue mich über Feedback von Ihnen, entweder wenn Sie diese Lösung passend finden oder nicht.
Logging, oder in Abhängigkeit von anderen Diensten in Shutdown-Hooks, war die ganze Zeit schlechte Praxis, und jetzt holt es auf. –
@MarkoTopolnik Wenn es eine schlechte Übung ist, wie Sie sagen, was schlagen Sie vor, wenn die Ausgabe eines Shutdown-Hook-Threads eine Aufzeichnung/Protokollierung benötigt? – vegemite4me
Da im Shutdown-Hook man nicht darauf zählen kann, dass irgendein Teil des initialisierten Zustands noch existiert, ist das einzige, was ich als halb-zuverlässig erachte, ein vollständig in sich geschlossenes Stück Code, das eine Datei erstellt und darauf schreibt. Ähnlich wie ein Core-Dump gemacht wird. –