我一直在升级一个大型服务类型的java程序(不是我写的,第一次接触它),它有大量的开源库,我正在升级到log4j 2,它以前有log4j,但我不知道它是否能正常工作。
我根本没有得到日志文件。这是在使用NetBeans 8的本地开发环境中。我的类路径中有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文件,也没有从log4j 2到stdout的任何日志记录。我没有得到log4j 2消息,说明它找不到配置文件。
配置文件、类变量和日志调用都是从该集合中日志正常工作的另一个程序复制的。
我从一些开源类中获得了一些stdout日志记录,主要是在com.sun.enterprise.ee.cms.impl.jxta和com.sun.enterprise.ee.cms.impl.jxtamgmt名称空间中。
我有一种感觉,开源日志可能与log4j 2冲突,因为我从其他程序复制的代码工作正常。
谢谢。
编辑:更多分辨率详情:其中一个开源库jar文件(jgroups)包含了一个log4j2.xml文件,它的设置是有效的,这个配置文件代替了我的配置文件,因为这个项目是用类路径中的lib jar文件配置的,在定制源之前,我只是在设置了你建议的log4j2.debug属性之后才发现这个问题。
这个jgroups配置文件没有导致log4j 2错误,但也没有生成我能找到的日志文件。
我的解决方案是将自定义源文件夹放在类路径中的lib jar之前,这一方法奏效了,在不将其转换为类路径顺序线程的情况下,我认为自定义应该放在第一位,而不管这个问题,但是netbeans的默认设置似乎是先使用库jar,然后再使用自定义。
2条答案
按热度按时间fgw7neuy1#
我没有看到配置文件有任何问题,我怀疑没有日志文件的原因是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(Also,确保您使用的是最新版本的Log4j2。)
h4cxqtbf2#
要解决此问题,您只需要更改xml文件的存储。例如:\源\主\资源\日志4j2.xml