2012-05-22 14 views
8

Desidero creare e abilitare un appender per un metodo particolare chiamata MyMethod(), il cui output di registro deve passare a un file presente in "logFilePath" .Log4j: creazione/modifica di appendici in fase di runtime, file di registro ricreato e non aggiunto

Non voglio includere questo appender nel file di configurazione xml, quindi ho pensato di crearlo in fase di esecuzione.

In primo luogo, ho provato a modificare le proprietà del logger in fase di esecuzione e quindi chiamare activateOptions, ad es. impostando il livello su DEBUG prima e impostandolo su Off nel blocco finally, in modo che l'output venga registrato solo mentre il metodo è in uso. Non ha funzionato.

Il mio problema qui è che l'appender ricrea un file ogni volta e non aggiunge lo stesso file. Questo è a dispetto di setAppend essere vero.

Non ho molta familiarità con log4j, quindi non esitate a suggerire un approccio alternativo. Quanto segue è un codice di esempio per spiegare cosa sto provando.

private static FileAppender createNewAppender(String logFilePath) { 
    FileAppender appender = new FileAppender(); 
    appender.setName("MyFileAppender"); 
    appender.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n")); 
    appender.setFile(logFilePath); 
    appender.setAppend(true); 
    appender.setThreshold(Level.INFO); 
    appender.activateOptions(); 
    Logger.getRootLogger().addAppender(appender); 
    return appender; 
} 

private static void removeAppender() { 
    Logger.getRootLogger().removeAppender(fileAppender) ; // ("MyFileAppender"); 
} 

io chiamo i metodi di cui sopra nel seguente modo:

private static FileAppender fileAppender = null; 

private static void myMethod(String logFilePath) {   
    try { 
     fileAppender = createNewAppender(); 
     someOperation(); 
    } 
    finally { 
     removeAppender(); 
     fileAppender=null; 
    } 
} 

risposta

7

molto semplice basta creare un metodo e aggiungere questo

String targetLog="where ever you want your log" 

FileAppender apndr = new FileAppender(new PatternLayout("%d %-5p [%c{1}] %m%n"),targetLog,true);  
logger.addAppender(apndr); 
logger.setLevel((Level) Level.ALL); 

poi in qualsiasi metodo devi effettuare il login basta fare this: logger.error ("il tuo errore qui");

0

faccio la seguente da Scala (fondamentalmente la stessa):

Imposta livello di registrazione di radice in TRACE, ma impostare la soglia sul mio appenders globali per informazioni.

# Root logger option 
log4j.rootLogger=TRACE, file, stdout 

# log messages to a log file 
log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=./log.log 
log4j.appender.file.MaxFileSize=100MB 
log4j.appender.file.MaxBackupIndex=1 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{HH:mm:ss} %m%n 
log4j.appender.file.Threshold=INFO 

# log messages to stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss} %m%n 
log4j.appender.stdout.Threshold=INFO 

Poi nella classe Voglio accedere:

private def set_debug_level(debug: String) { 
    import org.apache.log4j._ 
    def create_appender(level: Level) { 
    val console_appender = new ConsoleAppender() 
    val pattern = "%d %p [%c,%C{1}] %m%n" 
    console_appender.setLayout(new PatternLayout(pattern)) 
    console_appender.setThreshold(level) 
    console_appender.activateOptions() 
    Logger.getRootLogger().addAppender(console_appender) 
    } 
    debug match { 
    case "TRACE" => create_appender(Level.TRACE) 
    case "DEBUG" => create_appender(Level.DEBUG) 
    case _ => // just ignore other levels 
    } 
} 

Quindi, in pratica, dal momento che ho impostato la soglia del mio nuovo appender di traccia o DEBUG sarà effettivamente aggiungerà. Se cambio la radice in un altro livello non registrerà un livello inferiore.

Problemi correlati