2012-05-22 13 views
8

Chcę utworzyć i włączyć program dostarczający dla konkretnej metody wywołania MyMethod(), którego wynik logu powinien przejść do pliku znajdującego się w "logFilePath" .Log4j: Tworzenie/modyfikowanie aplikacji w czasie wykonywania, odtworzenie pliku dziennika i niepowiązanie

Nie chcę dołączać tego aplikatora do pliku konfiguracyjnego xml, więc pomyślałem o utworzeniu go w czasie wykonywania.

Po pierwsze, próbowałem zmodyfikować właściwości rejestratora w środowisku wykonawczym, a następnie wywołać metodę activateOptions, np. ustawienie poziomu DEBUG przed i ustawienie go na Off w bloku finally, tak aby dane wyjściowe były rejestrowane tylko wtedy, gdy metoda jest w użyciu. To nie zadziałało.

Moim problemem jest to, że appender odtwarza plik za każdym razem i nie dołącza do tego samego pliku. To jest nieważne, że setAppend jest prawdziwe.

Nie znam log4j, więc proszę sugerować alternatywne podejście. Poniżej przedstawiono przykładowy kod wyjaśniający, co próbuję.

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

Wzywam powyższe metody w następujący sposób:

private static FileAppender fileAppender = null; 

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

Odpowiedz

7

bardzo łatwo po prostu utworzyć metodę i dodać tę

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

następnie w dowolnej metody musisz się zalogować tylko zrobić to: logger.error ("Twój błąd tutaj");

0

I wykonaj następujące czynności z Scali (w zasadzie to samo):

Ustaw moją główny poziom rejestrowania prześledzić ale ustawić próg na moich globalnych appenders do informacji.

# 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 

Następnie w klasie Chcę zalogować:

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 
    } 
} 

Więc w zasadzie, bo ustawiony próg mojego nowego appender prześledzić lub DEBUG będzie faktycznie dopisywania. Jeśli zmienię root na inny poziom, nie zaloguję się na niższym poziomie.

Powiązane problemy