Java >> Java tutorial >  >> Tag >> Log4j

Hvordan logger man i shutdown hooks med Log4j2?

Fra 2.0-beta9 kan dette nu konfigureres i xml

<configuration ... shutdownHook="disable">

I betragtning af, at det nu er deaktiveret, tror jeg, at jeg er nødt til manuelt at lukke logningssystemet ned i slutningen af ​​min shutdown-hook. Jeg kunne dog ikke finde et middel gennem den eksterne grænseflade, kun i det interne API

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.LoggerContext;
...

public static void main(String[] args) {
    final AnnotationConfigApplicationContext springContext = new AnnotationConfigApplicationContext(AppConfig.class)

    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            //shutdown application
            LOG.info("Shutting down spring context");
            springContext.close();

            //shutdown log4j2
            if( LogManager.getContext() instanceof LoggerContext ) {
                logger.info("Shutting down log4j2");
                Configurator.shutdown((LoggerContext)LogManager.getContext());
            } else
                logger.warn("Unable to shutdown log4j2");
        }
    });

    //more application initialization
}

Opdatering:

Der er LogManager.shutdown() metode siden log4j version 2.6


Jeg har stort set lige svaret på det samme spørgsmål, og jeg vil meget gerne dele mit svar her. Jeg opfordrer dig til at læse hele svaret her. Jeg vil forsøge at give et resumé her og tilpasse mit svar til den aktuelle kontekst.

I den første version leverede Log4j en API til manuelt at kalde nedlukningsproceduren. Af grunde, vi ikke har kendskab til, blev den fjernet fra den anden version. Nu er den rigtige måde at gøre det på (ifølge den ikke-eksisterende dokumentation), at sørge for din egen implementering af ShutdownCallbackRegistry interface, som er ansvarlig for nedlukningsproceduren.

Forslag til løsning

Det, jeg gjorde for at løse dette problem, er, at jeg implementerede min egen version af ShutdownCallbackRegistry interface. Den gør for det meste de samme ting, som standardimplementeringen gør, men i stedet for at registrere sig selv som en shutdown-hook til JVM, venter den, indtil den aktiveres manuelt.

Du kan finde den komplette løsning og instruktioner på GitHub/DjDCH/Log4j-StaticShutdown og bruge det i dine egne projekter. Som udgangspunkt skal du til sidst kun gøre noget som dette i din ansøgning:

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();
        }
    }
}));

Jeg kan ikke uden tvivl sige, at dette er den perfekte løsning, og at min implementering er perfekt, men jeg prøvede at gøre det på den rigtige måde. Jeg vil være glad for at høre feedback fra dig, enten hvis du finder denne løsning passende eller ej.


Java tag