为什么log4j2不生成日志文件?

时间:2018-01-04 19:34:05

标签: logging log4j log4j2

我的任务是升级一个大型服务类型的java程序(不是我写的,第一次接触它),它有大量的开源库。我升级到log4j2,之前有log4j,但我不知道它是否能正常工作。

我根本没有收到日志文件。这是在使用NetBeans 8的本地开发环境中。我的classpath中有log4j-api和log4j-core 2.9.0文件。我在项目根目录中的log4j2.xml文件是:

<?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="FileAppender" fileName="DistEngine.log" immediateFlush="true" append="false" >
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
</Appenders>
<Loggers>
    <Root level="ALL">
        <AppenderRef ref="FileAppender"/>
        <AppenderRef ref="Console"/>
    </Root>
</Loggers>

类日志记录变量是(是的,类名是Main,它扩展了父类):

private static final Logger MAINLOGGER = LogManager.getLogger(Main.class);

此起始类的main()方法的第一行是:

MAINLOGGER.info("entering listener main");

我没有在项目根目录中获取DistEngine.log文件,也没有从log4j2到stdout的任何日志记录。我没有收到log4j2消息,指出它无法找到配置文件。

配置文件,类变量和日志调用都是从此集合中的另一个程序复制的,其中日志记录正常工作。

我从一些开源类获得了一些stdout日志记录,主要是在com.sun.enterprise.ee.cms.impl.jxta和com.sun.enterprise.ee.cms.impl.jxtamgmt名称空间中。

我觉得开源日志记录可能与log4j2冲突,因为我复制代码的其他程序工作正常。

感谢。

编辑:更多分辨率细节: 其中一个开源库jar文件(jgroups)包含一个带有效设置的log4j2.xml文件。由于项目在自定义源之前的类路径中配置了lib jars,因此使用此配置文件而不是我的配置文件。我在设置你建议的log4j2.debug属性后才发现这个。

这个jgroups配置文件没有导致log4j2错误,但它也没有生成我能找到的日志文件。

我的解决方案是将自定义源文件夹放在类路径中的lib jars之前,并且它有效。如果不将此转换为类路径顺序线程,在我看来自定义应该首先出现,无论此问题如何,但看起来netbeans默认是库jar,然后是自定义。

1 个答案:

答案 0 :(得分:1)

我没有看到配置文件有任何问题。我怀疑没有日志文件的原因是Log4j2没有看到配置文件。

默认情况下,Log4j2在类路径中查找配置文件。这是第一件要检查的事情。 netbeans是否在类路径中包含项目根目录?

您还可以使用系统属性-Dlog4j.configurationFile=path/to/log4j2.xml指定配置文件的路径。 见https://logging.apache.org/log4j/2.x/faq.html#config_location

您可以通过设置系统属性log4j2.debug进一步排除配置故障。见https://logging.apache.org/log4j/2.x/faq.html#troubleshooting

(另外,请确保您使用的是最新版本的Log4j2。)