2013-09-24 98 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