【问题标题】:Log4J2 and Tomee Plus 7.0.47 not workingLog4J2 和 Tomee Plus 7.0.47 不工作
【发布时间】:2014-04-30 08:11:51
【问题描述】:

根据here,Log4j2 应该适用于 Tomcat7.0.47。我正在使用 TomEE Plus 7.0.47。

我在我的 web-inf/classes 文件夹中部署了一个带有 log4j2.xml 的 web 应用程序。这是配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <File name="File" fileName="${sys:catalina.home}/logs/testapp.log">
        <PatternLayout>
            <pattern>%d %p %C{1.} [%t] %m%n</pattern>
        </PatternLayout>
    </File>
</Appenders>
<Loggers>
    <Logger name="org.alex" level="TRACE" additivity="false">
        <AppenderRef ref="File"/>
    </Logger>
    <Root level="INFO">
        <AppenderRef ref="Console"/>
    </Root>
</Loggers>
</Configuration>

我在一个名为 org.alex.util.JSON 的类中声明了一个记录器:

private static final Logger LOG = LoggerFactory.getLogger(JSON.class);

我使用的是 slf4j-api 1.7.5,并在 tomcat 库中添加了以下库:

  • slf4j-api-1.7.5.jar
  • log4j-api-2.0-rc1.jar
  • log4j-core-2.0-rc1.jar
  • log4j-slf4j-impl-2.0-rc1.jar

如果我将配置状态更改为 TRACE,我可以看到我的配置文件被拾取并且配置按预期进行。我还可以看到正在添加的 MBean。 但是,我的日志文件中没有一条日志记录语句结束。我调试到 log4j2 记录器,看到 isEnabled(...) 方法返回 false 因为记录器(com.alex.util.JSON)设置了级别“错误”,而配置将包 org.alex 设置为 TRACE . 进一步调查显示它使用为 level=ERROR 配置的 DefaultConfiguration,并且只配置了 root。我正在考虑一个类加载器问题,但我似乎无法弄清楚原因是什么以及如何解决它。 有谁知道我做错了什么?

【问题讨论】:

    标签: java log4j2 apache-tomee


    【解决方案1】:

    这应该适用于主干

    顺便说一句,log4j2 对 tomcat 有 hack,并且由于 tomee 包装了类加载器,因此不确定它们是否按预期工作......

    【讨论】:

      【解决方案2】:

      这很奇怪。请在 Log4j2 问题跟踪器中为此提出票证,以便 Log4j 团队可以查看。

      如果您将您提到的 jar 文件放在 WEB-INF/lib 中而不是 Tomcat 的 lib 文件夹中,问题可能会消失。

      【讨论】:

      • 嗨 Remko,确实将 jars 放在 webapps 库中解决了这个问题。我再次恢复了旧情况以确保它不起作用,但它没有。此外,我注意到在配置中创建的记录器实例的类加载器是 org.apache.openejb.core.TempClassLoader,而调用的记录器的类加载器是 org.apache.catalina.loader.StandardClassLoader。我对整个机制了解的不够多,无法判断这是否可以预期,但无论如何我都会在问题报告中提及。干杯,亚历克斯
      • 与 Tomcat 相比,问题似乎源于 TomEE 的类加载器重载。
      【解决方案3】:

      完整的 log4j2 依赖于 servletcontainerinitializer,它在 ejb 和应用程序扫描之后调用,因此 ejb 可能会过早加载。对 tomcat 上下文侦听器执行相同操作会使其更好地工作

      【讨论】:

        猜你喜欢
        • 2015-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 2013-08-01
        • 2016-08-28
        相关资源
        最近更新 更多