如何配置Log4J2

时间:2013-12-03 23:33:45

标签: java logging configuration log4j log4j2

我现在花了几个小时试图解决这个问题并完全失败。我发现新配置过程不必要地复杂。

我有一个带有web.xml文件的Servlet,其中包含以下内容:

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>file:///etc/myApp/log4j2.xml</param-value>
</context-param>

它似乎没有任何效果。我使用的是Tomcat 7.0.42,我已经删除了catalina.properties文件中对log4j * .jar的所有引用。我的应用程序中的日志仍在发送,但它们只是被发送到System.out而没有我指定的格式。

所以,我试着亲自手工完成:

InputStream in =
    new FileInputStream(new File("/etc/myApp/log4j2.xml"));
ConfigurationSource source = new ConfigurationSource(in);
ConfigurationFactory factory = new XMLConfigurationFactory();
Configuration configuration = factory.getConfiguration(source);
LoggerContext context = (LoggerContext) LogManager.getContext();
context.start(configuration);
context.updateLoggers();

Logger.getLogger("Test").log(Level.INFO, "This is a logging message.");

首先,这似乎完全令人费解。显然,存在一些代码,它们将通过“log4jConfiguration”属性搜索不同的文件并根据它们的扩展来假设文件类型,那么为什么LogManger.reconfigure(String)不具有相同的效果?

其次,这也没有效果。同样,日志将打印到System.out,并且没有执行任何请求的格式化。

以下是我的log4j2.xml的内容:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>

    <File name="LogFile" fileName="/var/log/myApp/myApp.log">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %p %c{1.} [%t] %m%n"/>
    </File>
  </Appenders>
  <Loggers>
    <Root level="DEBUG">
      <AppenderRef ref="Console" level="DEBUG"/>
      <AppenderRef ref="LogFile" level="DEBUG"/>
    </Root>
  </Loggers>
</Configuration>

两种情况下的输出都是:

Dec 03, 2013 6:06:45 PM test.Test main
INFO: This is a logging message.

提前致谢,

约翰

编辑:这实际上是有效的。看来我失踪了,“log4j-jcl-2.0-beta9.jar”。如果上面的“上下文参数”不起作用,Remko Popma的答案也会起作用。

1 个答案:

答案 0 :(得分:2)

webapp日志记录有许多可能的情况,这使得配置比理想情况更复杂。将log4j2 jar和配置文件放在webapp的类路径中应该可以正常工作。您是否在Web应用程序中看到了log4j2的手册页?如果问题仍然存在,请提交log4j2 jira票。