【问题标题】:How to configure slf4j - log4j per-deployment logging for JBoss 7.2如何为 JBoss 7.2 配置 slf4j - log4j per-deployment logging
【发布时间】:2013-09-29 08:04:00
【问题描述】:

在我的 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 记录器 - 这不是我想要的。

【问题讨论】:

    标签: java logging jboss log4j slf4j


    【解决方案1】:

    这个问题有一个丑陋的解决方法(这不是我问题的正确答案):

    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 没有实现 configure(java.io.InputStream)。不酷:(

    【讨论】:

    【解决方案2】:

    试试这个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
    

    【讨论】:

    • 唯一的区别是你添加了 log4j.appender.stdout.Threshold=debug。重点是什么?无论如何,它没有帮助(为什么要这样做?)
    • 这些实际上都没有用,因为它基本上不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多