2013-09-24 143 views
1

在我的WAR中,我想使用log4j.properties(位於WEB-INF/classes)進行我自己的設置。按照here所述的每部署日誌記錄不起作用,即JBoss不會記錄我的應用程序中的任何內容。我簡單的應用程序(重現該問題)包含:如何爲JBoss 7.2配置slf4j - log4j每部署日誌記錄

WEB-INF/classes/log4j.properties 
WEB-INF/classes/logging/LoggingContextListener.class 
WEB-INF/lib/log4j-1.2.17.jar 
WEB-INF/lib/slf4j-api-1.7.5.jar 
WEB-INF/lib/slf4j-log4j12-1.7.5.jar 

其中LoggingContextListener只是記錄一些隨機字符串。 log4j.properties包含:

log4j.rootLogger=WARN, 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{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

任何人都遇到過類似的問題?

你知道嗎可修復?怎麼樣?

爲了避免對這裏的日誌門檻混亂年代LoggingContextListener

System.err.println("Trying to log something using SLF4J-Log4J"); 
org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(getClass()); 
logger.error("Hello"); 
logger.warn("anybody home?"); 
logger.info("can you hear me?"); 
logger.debug("WTF?"); 
System.err.println("Did you notice any logs?"); 

身體當我從classpath中我得到刪除log4j.properties

ERROR [stderr] (ServerService Thread Pool -- 54) Trying to log something using SLF4J-Log4J 
ERROR [logging.LoggingContextListener] (ServerService Thread Pool -- 54) Hello 
WARN [logging.LoggingContextListener] (ServerService Thread Pool -- 54) anybody home? 
INFO [logging.LoggingContextListener] (ServerService Thread Pool -- 54) can you hear me? 
ERROR [stderr] (ServerService Thread Pool -- 54) Did you notice any logs? 

但這些日誌直接從JBoss的到來記錄器配置在standalone.xml - 不是我想要的。

回答

0

試試這個log4j.properties 添加更多的特性

log4j.appender.stdout.Threshold=debug 

複製粘貼下面的屬性並測試它

log4j.rootLogger=WARN, stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Threshold=debug 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%m%n 
+0

唯一的區別是,你添加了log4j.appender.stdout.Threshold = debug。有什麼意思?反正它沒有幫助(爲什麼要這樣?) – pbielicki

+0

看到這個.. http:// stackoverflow.com/questions/5119883/log4j-what-is-threshold –

+0

閾值決定您的日誌記錄模式,無論是錯誤,調試.. –

2

有一個醜陋的解決方法這個問題(這不是一個正確的答案,我問題):

Properties props = new Properties(); 
props.load(getClass().getResourceAsStream("/log4j.xxx.properties")); 
PropertyConfigurator.configure(props); 

此代碼應該只執行一次,所以最好在你自己的一些ServletContextListener實現中執行。小心 - 你必須重命名你的log4j.properties,否則JBoss會「照顧」它,並且會吞下你所有的日誌。

但是這應該由JBoss來完成!至少這是他們在他們的文檔中寫的。

這是一個明顯的錯誤,所以我要去舉報他們的JIRA

PS。有趣的是:當你的類路徑中有log4j時,即使部署模塊應該獨立於根,它也不會被考慮在內。 JBoss使用本地生成的log4j implementation。後果:當您嘗試撥打:

PropertyConfigurator.configure(getClass().getResourceAsStream("/log4j.xxx.properties")); 

具有構建類路徑原來的log4j,你會在運行時得到NoSuchMethodException作爲他們PropertyConfigurator沒有實現配置(java.io.InputStream中)。不爽:(

+0

我在Wild have中遇到了同樣的問題,發現這個jira問題(歸類爲「minor」:-(https://issues.jboss.org/browse/WFLY- 2012 – geert3