2011-12-28 175 views
6

我在將堆棧跟蹤打印到我的日誌文件時出現問題。 Log4j.properties:log4j截斷堆棧跟蹤

log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=/var/log/app/application.log 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n 

log4j.rootLogger=warn, file 
log4j.logger.com.app=info, file 
log4j.additivity.com.app=false 

當我登錄這樣的異常在我的課UserGuard.java:

} catch (Exception e) { 
    log.error("Uncatched error", e); 
    response.setEntity(new StringRepresentation(" ")); 
    response.setStatus(Status.SERVER_ERROR_INTERNAL); 
} 

這導致我application.log:

2011-12-28 07:30:03 UserGuard [ERROR] Uncatched error 
java.lang.NullPointerException 

沒有堆棧顯示的痕跡。這真的很煩人。 謝謝!

在另一臺機器上嘗試了相同的pom.xml和相同的log4j.properties,並且正常工作。我應該認爲這個問題是我的Java版本嗎?

+0

'log4j.additivity.file = false' – 2011-12-28 12:59:48

+0

如果您使用不同的appender,例如ConsoleAppender,問題是否仍然存在?您是否嘗試過運行啓用了調試輸出的log4j,以便您可以查看log4j配置中是否有任何錯誤? – chrisbunney 2011-12-28 13:02:16

+0

我確實嘗試過都沒有成功。查看我的編輯 – Gonzalo 2011-12-28 19:36:58

回答

6

你的堆棧跟蹤最有可能得到截斷由於熱點的優化。優化只會構建有限次數的相同堆棧跟蹤,然後來自同一確切位置的未來異常實例不會構建它。

您可以使用-XX:-OmitStackTraceInFastThrow標誌關閉此優化,也可以返回到較早的日誌以查找發生此異常的第一個實例(它會被記錄一次,然後稍後進行優化)。

請參閱此相關的StackOverflow questionthis one,以及blog post over here

+1

非常感謝!那樣做了! – Gonzalo 2013-01-14 14:53:56