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

Programmering af Log4j-loggere

Du kan tilføje/fjerne Appender programmatisk til Log4j:

  ConsoleAppender console = new ConsoleAppender(); //create appender
  //configure the appender
  String PATTERN = "%d [%p|%c|%C{1}] %m%n";
  console.setLayout(new PatternLayout(PATTERN)); 
  console.setThreshold(Level.FATAL);
  console.activateOptions();
  //add appender to any Logger (here is root)
  Logger.getRootLogger().addAppender(console);

  FileAppender fa = new FileAppender();
  fa.setName("FileLogger");
  fa.setFile("mylog.log");
  fa.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n"));
  fa.setThreshold(Level.DEBUG);
  fa.setAppend(true);
  fa.activateOptions();

  //add appender to any Logger (here is root)
  Logger.getRootLogger().addAppender(fa);
  //repeat with all other desired appenders

Jeg vil foreslå, at du sætter det ind i en init() et sted, hvor du er sikker på, at dette vil blive udført før noget andet. Du kan derefter fjerne alle eksisterende appenders på rodloggeren med

 Logger.getRootLogger().getLoggerRepository().resetConfiguration();

og start med at tilføje din egen. Du skal selvfølgelig have log4j i klassestien for at dette virker.

Bemærkning:
Du kan tage en hvilken som helst Logger.getLogger(...) du kan lide at tilføje bilag. Jeg tog lige root-loggeren, fordi den er i bunden af ​​alle ting og vil håndtere alt, der sendes gennem andre appenders i andre kategorier (medmindre andet er konfigureret ved at indstille additivitetsflaget).

Hvis du har brug for at vide, hvordan logning fungerer, og hvordan det bestemmes, hvor logs er skrevet, læs denne manual for mere info om det.
Kort sagt:

  Logger fizz = LoggerFactory.getLogger("com.fizz")

vil give dig en logger til kategorien "com.fizz".
For ovenstående eksempel betyder det, at alt, der logges med det, vil blive henvist til konsollen og filtillægget på root-loggeren.
Hvis du tilføjer en appender til Logger.getLogger("com.fizz").addAppender(newAppender), så logger du fra fizz vil blive håndteret af alle appenderne fra rodloggeren og newAppender .
Du opretter ikke loggere med konfigurationen, du leverer blot behandlere til alle mulige kategorier i dit system.


Det lyder som om du forsøger at bruge log4j fra "begge ender" (forbrugerenden og konfigurationsenden).

Hvis du vil kode mod slf4j api'et, men på forhånd (og programmatisk) bestemme konfigurationen af ​​log4j-loggerne, som klassestien vil returnere, har du absolut at have en form for logningstilpasning, som gør brug af doven konstruktion.

public class YourLoggingWrapper {
    private static boolean loggingIsInitialized = false;

    public YourLoggingWrapper() {
        // ...blah
    }

    public static void debug(String debugMsg) {
        log(LogLevel.Debug, debugMsg);
    }

    // Same for all other log levels your want to handle.
    // You mentioned TRACE and ERROR.

    private static void log(LogLevel level, String logMsg) {
        if(!loggingIsInitialized)
            initLogging();

        org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger("DebugLogger");

        switch(level) {
        case: Debug:
            logger.debug(logMsg);
            break;
        default:
            // whatever
        }
    }

    // log4j logging is lazily constructed; it gets initialized
    // the first time the invoking app calls a log method
    private static void initLogging() {
        loggingIsInitialized = true;

        org.apache.log4j.Logger debugLogger = org.apache.log4j.LoggerFactory.getLogger("DebugLogger");

        // Now all the same configuration code that @oers suggested applies...
        // configure the logger, configure and add its appenders, etc.
        debugLogger.addAppender(someConfiguredFileAppender);
    }

Med denne tilgang behøver du ikke bekymre dig om, hvor/hvornår dine log4j-loggere bliver konfigureret. Første gang klassestien spørger efter dem, bliver de dovent konstrueret, sendt tilbage og gjort tilgængelige via slf4j. Håber dette hjalp!


Hvis du har defineret en tilføjelse i log4j-egenskaber og gerne vil opdatere den programmatisk, skal du angive navnet i log4j-egenskaberne og få den ved navn.

Her er et eksempel på log4j.properties-indgang:

log4j.appender.stdout.Name=console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.Threshold=INFO

For at opdatere den skal du gøre følgende:

((ConsoleAppender) Logger.getRootLogger().getAppender("console")).setThreshold(Level.DEBUG);

Java tag