2013-02-20 106 views
1

我有一個獨立的java應用程序。應用程序使用了兩個庫,它由maven和'shade'插件管理,以創建具有所有依賴關係的一個大型jar文件。將未捕獲的異常記錄到文件中有問題(應用程序在Linux上運行)。我配置了log4j.properties並添加了滾動文件appender。它正在工作,但每當拋出異常時,它都會打印在控制檯上,而不是在配置的日誌文件中。基本上,我以所有INFO +條目的日誌文件結束,但沒有例外(未捕獲)。Java獨立應用程序日誌記錄異常(log4j)

這裏是log4j.properties:

# Root logger option 
log4j.rootLogger=INFO, file 

# Direct log messages to a log file 
log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=logs/my-app.log 
log4j.appender.file.MaxFileSize=100MB 
log4j.appender.file.MaxBackupIndex=10 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

我使用的是運行應用程序:

java -jar -Dlog4j.configuration=file:log4j.properties myApp.jar >> logs/my-app.log 2>&1 

java -jar -Dlog4j.configuration=file:log4j.properties myApp.jar 

目前我使用控制檯的appender和運行的應用程序使用繞過問題...但我真的想使用滾動文件appender。

回答

0

對於異常情況,您不應使用e.printStackTrace() ,而應使用logger.fatal(e.getStrackTrace())。

+0

我知道這一點。異常是從第三方庫引發的。 – szymon 2013-02-20 09:36:07

+0

嘗試捕獲對lib的調用?因此,這個例外不會一直持續下去 – Julien 2013-02-20 09:56:54

0

如果例外情況是未被捕獲那麼它們將不會被log4j記錄。所以我認爲重定向非常有用,無論如何。

注意,如果(說)你通過殺死-3,出來的stderr,因此我總是會趕上stderr/out,並將其寫入日誌文件從log4j的文件不同的觸發線程堆棧跟蹤。

由於您無法保證寫入相同日誌文件的兩個進程將正確交錯,因此我不會將重定向和log4j都記錄到同一個日誌文件中(如上所述)。

4

找到了解決此類問題的解決方案。 這很容易。你需要在你的'main'類中添加DefaultUncaughtExceptionHandler。 這裏是摘錄:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 

     @Override 
     public void uncaughtException(Thread t, Throwable e) { 
      logger.error("Uncaught exception", e); 
     } 
    });