转换logcat的log4j.properties文件以使用Log4j2

时间:2014-12-30 19:56:57

标签: tomcat logging log4j2

我正在尝试配置Tomcat 8以使用Log4j2进行日志记录。

我找到了Logging in Tomcat using Log4j的参考资料。它提供了一个示例log4j.properties文件,该文件配置Log4j以匹配Tomcat的内部日志记录。转换为Log4j2的大部分内容看起来非常简单,但最后将记录器映射到appender的部分让我感到难过:

# Configure which loggers log to which appenders
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost] = INFO, LOCALHOST
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager] =\
  INFO, MANAGER
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager] =\
  INFO, HOST-MANAGER

是否有人将此配置转换为使用Log4j2?我一直在使用Log4j2配置文档并阅读了Log4j2 Architecture page,但是我没有找到很多关于如何在Log4j2中进行这种容器映射的材料。

我想我可以为每个容器单独配置,但我更喜欢将它保存在一个地方,如示例Log4j配置。

3 个答案:

答案 0 :(得分:15)

在提出这个问题之后,我花了一些时间来设置log4j2,这就是 我想出了log4j2.xml档案。它模仿配置 在Logging in Tomcat using Log4j中描述。它使用多个记录器来路由消息 分隔日志文件。

<?xml version="1.0" encoding="utf-8"?>
<Configuration status="info">
  <Properties>
    <Property name="logdir">${sys:catalina.base}/logs</Property>
    <Property name="layout">%d [%t] %-5p %c- %m%n</Property>
  </Properties>
  <Appenders>
    <Console name="CONSOLE" target="SYSTEM_OUT">
      <PatternLayout pattern="${layout}"/>
    </Console>
    <RollingFile name="CATALINA"
        fileName="${logdir}/catalina.log"
        filePattern="${logdir}/catalina.%d{yyyy-MM-dd}-%i.log">
      <PatternLayout pattern="${layout}"/>
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="1 MB"/>
      </Policies>
      <DefaultRolloverStrategy max="10"/>
    </RollingFile>
    <RollingFile name="LOCALHOST"
        fileName="${logdir}/localhost.log"
        filePattern="${logdir}/localhost.%d{yyyy-MM-dd}-%i.log">
      <PatternLayout pattern="${layout}"/>
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="1 MB"/>
      </Policies>
      <DefaultRolloverStrategy max="10"/>
    </RollingFile>
    <RollingFile name="MANAGER"
        fileName="${logdir}/manager.log"
        filePattern="${logdir}/manager.%d{yyyy-MM-dd}-%i.log">
      <PatternLayout pattern="${layout}"/>
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="1 MB"/>
      </Policies>
      <DefaultRolloverStrategy max="10"/>
    </RollingFile>
    <RollingFile name="HOST-MANAGER"
        fileName="${logdir}/host-manager.log"
        filePattern="${logdir}/host-manager.%d{yyyy-MM-dd}-%i.log">
      <PatternLayout pattern="${layout}"/>
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="1 MB"/>
      </Policies>
      <DefaultRolloverStrategy max="10"/>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="CATALINA"/>
    </Root>
    <Logger name="org.apache.catalina.core.ContainerBase.[Catalina].[localhost]"
        level="info" additivity="false">
      <AppenderRef ref="LOCALHOST"/>
    </Logger>
    <Logger name="org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager]"
        level="info" additivity="false">
      <AppenderRef ref="MANAGER"/>
    </Logger>
    <Logger name="org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager]"
        level="info" additivity="false">
      <AppenderRef ref="HOST-MANAGER"/>
    </Logger>
  </Loggers>
</Configuration>

然而,要使其正常工作需要获得 一堆其他文件 配置正确。 tomcat 7 internal logging with log4j2.xml Using Log4j 2 in Web Applications 从Paramita Banerjee那里发帖很有帮助。

此文件位于CATALINA_HOME/bin/

  • tomcat-juli.jar

如果您从Maven存储库中提取此信息,您将获得一个文件 命名为tomcat-extras-juli-8.0.15.jar(当前 我写这篇文章时的版本)。但是,它需要重命名为 tomcat-juli.jar - Tomcat安装脚本使用该名称 设置CLASSPATH。

这些文件位于CATALINA_HOME/lib/

  • commons-logging-1.2.jar
  • log4j-1.2-api-2.1.jar
  • log4j-api-2.1.jar
  • log4j-core-2.1.jar
  • log4j-jcl-2.1.jar
  • log4j-jul-2.1.jar
  • log4j-web-2.1.jar
  • tomcat-juli-adapters-8.0.15.jar
此处可能不需要

log4j-web-2.1.jar(它可能只需要与您的Web应用程序一起部署) - 其用途在 {{3}}。 只有在您拥有使用的应用程序时才需要log4j-1.2-api-2.1.jar 较旧的log4j 1.2接口。

CATALINA_BASE/conf中,我停用了logging.properties

我使用以下setenv.sh脚本来定义CLASSPATH和。{ Tomcat正确的LOGGING_MANAGER环境变量。它进入了 CATALINA_BASE/binCATALINA_HOME/bin。 (我把它放进去了 CATALINA_HOME / bin。)如果它是由Tomcat的启动脚本执行的。LOG4J_JARS="log4j-core-2.1.jar log4j-api-2.1.jar log4j-jul-2.1.jar" # make log4j2.xml available if [ ! -z "$CLASSPATH" ] ; then CLASSPATH="$CLASSPATH": ; fi CLASSPATH="$CLASSPATH""$CATALINA_BASE"/lib # Add log4j2 jar files to CLASSPATH for jar in $LOG4J_JARS ; do if [ -r "$CATALINA_HOME"/lib/"$jar" ] ; then CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/lib/"$jar" else echo "Cannot find $CATALINA_HOME/lib/$jar" echo "This file is needed to properly configure log4j2 for this program" exit 1 fi done # use the logging manager from log4j-jul LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager" / bin 当下。你可能更喜欢更简单的东西,但这是符合的 启动脚本的风格。

{{1}}
正如尼克在回答中提到的那样,那里也有输出 访问日志。我也没有试图对此做任何事情。

我希望其他人觉得这很有用。回想起来,看起来很漂亮 直截了当。但是,必须有很多部分 “恰到好处”让它发挥作用,这是一个挑战(至少对于一个 新手)。

答案 1 :(得分:1)

我遵循Logging in Tomcat using Log4j的引用并将tomcat-juli.jar添加到bin目录中,我还将tomcat-juli-adapters.jar添加到lib目录中。 然后我将log4j-api-2.1.jar,log4j-core-2.1.jar和log4j-1.2-api-2.1.jar添加到lib目录。

之后我将log4j2.xml添加到lib目录中。我使用基于时间和大小的滚动配置来保持配置相当简单,该滚动配置会压缩存档日志:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="catalina" packages="">

    <Appenders>
        <RollingRandomAccessFile name="catalina"
            fileName="${sys:catalina.base}/logs/catalina.log"
            filePattern="${sys:catalina.base}/logs/catalina/$${date:yyyy-MM}/catalina-%d{yyyy-MM-dd}-%i.log.zip">
            <PatternLayout>
                <Pattern>%d{MMM d, yyyy HH:mm:ss}: %5p (%F:%L) - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="250 MB" />
            </Policies>
            <DefaultRolloverStrategy max="100" />
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <!-- default loglevel for emaxx code -->
        <logger name="org.apache.catalina" level="info">
            <appender-ref ref="catalina" />
        </logger>
        <Root level="info">
            <appender-ref ref="catalina" />
        </Root>
    </Loggers>
</Configuration>

通过这种方式,您将获得catalina.log中的所有日志记录。 我还在努力让accessLog做同样的事情 编辑:我找到了this网站。这样您就可以将访问日志记录到catalina.log。 (我无法让它登录到它自己的appender)

我并不担心经理和主管经理的日志记录,因为我们在生产环境中没有这些日志,但他们也可能只登录到catalina.log。我还没有测试过它。

这是在tomcat-7.0.42上测试的,它也应该在tomcat8中运行。

答案 2 :(得分:0)

对于系统属性,您需要在变量前加上“sys:”,它表示系统属性

示例:

appender.file.fileName = $ {SYS:catalina.base} /logs/XXX.log

了解更多信息,请访问以下链接 http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution