【问题标题】:Log4j2 creates log file but doesn't write to itLog4j2 创建日志文件但不写入
【发布时间】:2014-06-03 10:30:44
【问题描述】:

我正在使用 Tomcat 8.0.3 和 log4j 2.0-rc1 来部署 GWT 应用程序(servlet 2.5)。

我相信我修复了通常的日志配置错误,但仍然没有任何内容记录到控制台或文件中。

我的 web.xml 的负责人:

<listener>
    <listener-class>org.apache.logging.log4j.core.web.Log4jServletContextListener</listener-class>
</listener>

<filter>
    <filter-name>log4jServletFilter</filter-name>
    <filter-class>org.apache.logging.log4j.core.web.Log4jServletFilter</filter-class>
</filter>

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>file:///C:/Users/name/Desktop/log4j2.xml</param-value>
</context-param>

<filter-mapping>
    <filter-name>log4jServletFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

这是 log4j2.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="TRACE">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%p] %c{1}: %m%n"/>
        </Console>
        <File name="infoFile" fileName="${sys:catalina.home}/logs/info.log" >
            <PatternLayout pattern="[%p] %c{1}: %m%n"/>
        </File>
    </Appenders>

    <Loggers>
        <Root level="info">
            <Appender-Ref ref="Console"/>
            <Appender-Ref ref="infoFile"/>
        </Root>
    </Loggers>
</Configuration>

我将 log4j2 api 和 core 添加到我的 Maven 依赖项中,我可以看到它们在 WEB-INF\classes\ 中爆炸。我还将它们从 catalina.properties 中的 skipJar 列表中删除。

部署战争时,不会在 localhost 或 catalina 日志中引发错误或警告。这是本地主机日志:

INFO  ContextListener: contextInitialized()
INFO  SessionListener: contextInitialized()
INFO  Log4jServletContextListener ensuring that Log4j starts up properly.
INFO  Log4jServletFilter initialized.

奇怪的是 info.log 文件已创建,但从未写入。
我也在使用 Hibernate,它的日志确实显示在控制台中,这可能是问题吗?

最后,这就是我使用记录器的方式:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

private static final Logger LOG = LogManager.getLogger(MyClass.class.getName());

public void myMethod() {
    LOG.info("Logging some message");
}

(log4j2 配置文件暂时在我的桌面,因为路径中好像不能使用空格)

【问题讨论】:

    标签: java tomcat logging configuration log4j2


    【解决方案1】:

    据我所知,您的配置是正确的,并且所有设置都按照 web 应用程序的 log4j2 manual page 中的描述进行设置。

    您可以尝试的一件事是将 log4j2.xml 配置文件放在类路径中(在 WEB-INF/classes 下)并删除 log4jConfiguration context-param 设置。但是由于您看到正在创建一个 info.log 文件,因此很可能已经正确发现了 log4j2.xml 文件,因此将其放在类路径中可能无济于事。 (不过值得一试。)

    我能想到日志文件中什么也没有出现的另外两个原因:日志输出被缓冲,并且缓冲区没有在每个事件上刷新。但是,FileAppender 的默认值是 immediateFlush=true,所以这意味着 rc1 中引入了一个新错误。这是可能的,但不太可能(当前的主干源看起来是正确的)。

    最后,是否有可能不调用您进行日志记录的方法(上面示例中的myMethod)?有没有办法验证这个方法是否被调用?

    【讨论】:

    • 如果我把它放在WEB-INF/classes 下并删除上下文参数,我实际上得到了No Log4j context configuration provided。我尝试将 immediateFlush 设置为 true,但没有记录任何内容。 myMethod 实际上是一种从数据库中检索用户的方法,并且这些用户由 Web 应用程序正确显示。在每种情况下,当我停止 Web 应用程序时,它都会显示:Removing LoggerContext for [null],这正常吗?
    • 在检查了我部署的战争之后,我注意到我所有的 .class 文件都是 5 天前的,即使我刚刚更改了它们。所以方法 is 实际上被调用了,但是 5 天的旧版本没有任何日志记录,所以当然没有任何日志记录。我手动添加了MyClass.class 并重新加载了webapp,它正在记录!现在修复我的 Maven 部署过程...
    【解决方案2】:

    就我而言,我已经正确配置了 log4j2.xml 文件,但是在实际记录时,我错误地在 Lombok 中使用了 @Slf4j 注释。将其更改为 @Log4j2 解决了该问题。

    【讨论】:

      猜你喜欢
      • 2018-06-28
      • 2017-01-17
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      相关资源
      最近更新 更多