在我的WAR中,我希望使用log4j.properties
(位于WEB-INF/classes
)拥有自己的设置。如here所述的按部署日志记录不起作用,即JBoss不会从我的应用程序中记录任何内容。我的简单应用程序(重现问题)包含:
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?");
当我从类路径中删除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?
但是这些日志直接来自standalone.xml
中配置的JBoss记录器 - 而不是我想要的。
答案 0 :(得分:2)
这个问题有一个丑陋的解决方法(这不是我的问题的正确答案):
Properties props = new Properties();
props.load(getClass().getResourceAsStream("/log4j.xxx.properties"));
PropertyConfigurator.configure(props);
这段代码应该只执行一次,所以理想情况下在你自己的一些ServletContextListener实现中。小心 - 你必须重命名你的log4j.properties,否则JBoss会“小心”它并将吞下你所有的日志。
但这应该由JBoss首先完成!至少这是他们在他们的文档中写的。
这是一个明显的错误,所以我将在他们的JIRA上报告
PS。有趣的是:当你的类路径中有log4j时,无论如何都不考虑它 - 即使部署模块应该独立于root。 JBoss使用自己开发的log4j implementation。结果:当你试着打电话时:
PropertyConfigurator.configure(getClass().getResourceAsStream("/log4j.xxx.properties"));
在构建类路径中具有原始log4j,您将在运行时获得NoSuchMethodException,因为它们的PropertyConfigurator未实现configure(java.io.InputStream)。不酷:(
答案 1 :(得分: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