将 Tomcat 的 log4j.properties 文件转换为与 Log4j2 一起使用



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

我找到了使用 Log4j 在 Tomcat 中日志记录的参考。它提供了一个示例 log4j.properties 文件,该文件配置 Log4j 以匹配 Tomcat 的内部日志记录。对于 Log4j2 来说,其中大部分看起来都非常简单,但是最后将记录器映射到追加程序的部分让我感到困惑:

# 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 架构页面,但我没有找到太多关于如何在 Log4j2 中进行这种容器映射的材料。

我想我可以为每个容器做一个单独的配置,但我更愿意把它放在一个地方,就像在示例 Log4j 配置中一样。

问完这个问题后,我花了一些时间来设置 log4j2,这是 我想log4j2.xml的文件。它模仿配置在 使用 Log4j 在 Tomcat 中日志记录中进行了描述。它使用多个记录器来路由消息以分隔日志文件。

<?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>

但是,要使其正常工作需要获得一堆其他文件配置正确。雄猫 7 内部日志记录与 log4j2.xmlParamita Banerjee的帖子对此很有帮助。

此文件输入CATALINA_HOME/bin/

  • tomcat-juli.jar

如果你从Maven存储库中提取这个,你会得到一个文件命名为类似tomcat-extras-juli-8.0.15.jar(当前版本,当我写这篇文章时)。但是,它需要重命名为 tomcat-juli.jar – Tomcat 安装脚本在设置类路径。

这些文件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 应用程序一起部署)——它的用法在在 Web 应用程序中使用 Log4j 2。 仅当您的应用程序使用log4j-1.2-api-2.1.jar较旧的 Log4J 1.2 接口。

CATALINA_BASE/conf年,我禁用了logging.properties

我使用以下setenv.sh脚本来定义CLASSPATH和 正确LOGGING_MANAGER Tomcat 的环境变量。它进入 CATALINA_BASE/bin或进入CATALINA_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"

正如尼克在他的回应中提到的,还有访问日志。我也没有尝试对此做任何事情。

我希望其他人觉得这很有用。回想起来,它似乎很漂亮简单。但是,必须有很多部分"恰到好处"地让它工作,这是一个挑战(至少对于新手)。

我遵循了使用 Log4j 在 Tomcat 中日志记录的参考,并将 tomcat-juli.jar 添加到 bin dir 中,我还添加了 tomcat-juli-adapters.jar 到 lib dir。之后,我将 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>

这样,您将获得卡塔利娜.log中的所有日志记录。我仍在努力让访问日志做同样的事情。
编辑:我找到了这个网站。这样,您可以将访问日志记录定向到Catalina.log。(我无法让它记录到它自己的附加器)

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

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

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

例:

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

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

最新更新