2014-09-16 15 views

Odpowiedz

9

Nie ma publicznego API dla tego, ale można użyć

((LifeCycle) LogManager.getContext()).stop(); 

Jeśli jesteś zainteresowany posiadaniem API publicznej na to, proszę głosować na lub dodać komentarz tutaj: https://issues.apache.org/jira/browse/LOG4J2-124


Aktualizacja:

W Log4j 2.5 można wywołać Configurator.shutdown(). Z Log4j 2.6 możesz zadzwonić pod numer LogManager.shutdown().

7

Wyjaśnienie i historia za

Co Log4j 2 stosowanie wewnętrznie jest to, co nazywają ShutdownRegistrationStrategy. Składa się z klasy rejestrującej jedno lub wiele wywołań zwrotnych wyłączania, które będą wywoływane w odpowiednim czasie. Zapewniają interfejs o nazwie ShutdownCallbackRegistry i ich domyślną implementację o nazwie DefaultShutdownCallbackRegistry. Ten rejestr implementacji jest sam w sobie hakiem zamykającym do JVM, z Runtime.getRuntime().addShutdownHook().

Zgodnie z niektórymi problemami w narzędziu do śledzenia błędów Log4j 2 (LOG4J2-868 i LOG4J2-658) właściwym sposobem jest zapewnienie własnej implementacji interfejsu ShutdownCallbackRegistry. Ponieważ nie ma publicznego interfejsu API do zamknięcia Log4j 2, jest to jedyny prawdziwy i prawidłowy sposób archiwizowania tego.

Proponowane rozwiązanie

Więc, co zrobiłem, aby rozwiązać ten problem jest to, że realizowane własną wersję interfejsu ShutdownCallbackRegistry. W większości robi to samo, co domyślna implementacja, ale zamiast rejestrować się jako hak zamykający, czeka, aż zostanie wywołany ręcznie. Jest to możliwe wewnętrznie poprzez utrzymywanie instancji obiektu w polu statycznym. Następnie musisz wywołać pojedynczą metodę statyczną, aby uruchomić procedurę zamykania, dlatego nazwałem ją StaticShutdownCallbackRegistry.

Kompletne rozwiązanie i instrukcje można znaleźć na stronie GitHub/DjDCH/Log4j-StaticShutdown i wykorzystywać je we własnych projektach. Zasadniczo, na koniec, trzeba tylko zrobić coś takiego w swojej aplikacji:

StaticShutdownCallbackRegistry.invoke(); 

Nie mogę powiedzieć bez żadnej wątpliwości, że jest to idealne rozwiązanie i że moje wykonanie jest doskonałe, ale starałem zrobić to we właściwy sposób (zgodnie z nieistniejącą dokumentacją na ten temat). Chętnie wysłucham opinii użytkowników, jeśli uznasz to rozwiązanie za odpowiednie lub nie.

+1

Wygląda wersji 2.6 dodaje powrotem właściwa instrukcja '.shutdown', może ktoś potwierdzić? To naprawdę nie działa tutaj –

6

Log4j-Web Biblioteka jest preferowanym sposobem prawidłowego czyszczenia zasobów w aplikacji WWW.

Aby ją włączyć, należy dodać taką zależność do pom.xml

<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-web</artifactId> 
    <version>${log4j2.version}</version> 
    <scope>runtime</scope> 
</dependency> 

Będzie ona działać 'out-of-the box' w Servlet 3. * środowisko. Jeśli używasz starszej specyfikacji Servlet, szczegóły, jak włączyć prawidłowe czyszczenie dla log4j2 dostępne są tutaj: https://logging.apache.org/log4j/2.x/manual/webapp.html

+0

Prawidłowa, wciąż odpowiednia odpowiedź. –

Powiązane problemy