Log4j2创建日志文件但不写入

时间:2014-04-18 20:53:12

标签: java tomcat logging configuration log4j2

我使用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>

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

部署战争时,localhost或catalina日志中不会抛出任何错误或警告。这是localhost日志:

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配置文件临时在我的桌面上,因为我似乎无法在路径中使用空格)

2 个答案:

答案 0 :(得分:2)

据我所知,您的配置是正确的,并且所有内容都按照log4j2 manual page中针对网络应用的说明进行设置。

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

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

最后,您的方法是否可能不会调用执行日志记录(上例中的myMethod)的方法?有没有办法验证是否调用了此方法?

答案 1 :(得分:0)

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