【问题标题】:Converting log4j.properties file for Tomcat to work with Log4j2将 Tomcat 的 log4j.properties 文件转换为使用 Log4j2
【发布时间】:2015-02-26 23:41:33
【问题描述】:

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

我找到了Logging in Tomcat using Log4j 的参考资料。它提供了一个示例 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 Architecture page,但我没有找到太多关于如何在 Log4j2 中进行这种容器映射的材料。

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

【问题讨论】:

  • 您是否尝试过在 tomcat-users 邮件列表中询问? tomcat.apache.org/lists.html 这是专家们常去的地方,你最有可能得到准确的答复。
  • 可能您将 log4j2 与 tomcat 一起使用的唯一机会是使用 log4j 1.x 桥。 logging.apache.org/log4j/2.0/manual/migration.html
  • @Brett Okken 这在 8.5.11 + 中不再适用。自 8.5.11 以来,7 月的附加功能已终止,您需要使用 log4j2 的唯一方法是使用 David Kellerman 脚本和来自 log4j2(核心、api、7 月)的 3 个 jar(加上配置文件)

标签: tomcat logging log4j2


【解决方案1】:

在问了这个问题之后,我又花了一些时间来设置 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 来自 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 应用程序一起部署)——它的使用在 Using Log4j 2 in Web Applicationslog4j-1.2-api-2.1.jar 仅当您的应用程序使用 较旧的 log4j 1.2 接口。

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

我使用以下setenv.sh 脚本来定义CLASSPATHLOGGING_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"

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

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

【讨论】:

  • 你的 log4j2.xml 文件是正确的,但是你的很多配置是多余的。我使用了这里的步骤:stackoverflow.com/a/35618384/399105
  • 我根据自己的需要做了一些调整,比如只做基于时间的滚动(而不是基于大小)和默认压缩日志:gist.github.com/bmaupin/475a0cd6e8b374d876f5085846761fb6
  • 感谢分享这个解决方案 - 让 log4j2 2.8.1 在 tomcat 9 上工作
  • 因为 tomcat 8+ 不需要额外的东西,你只需要 log4j-core-2.8.1.jar、log4j-api-2.8.1.jar、log4j-jul-2.8.1.jar 和 log4j2。库中的xml。使用 setenv.sh 中的上述脚本完成任务 - 在 8.5.11 上测试
  • Tomcat 8.5 及以上版本的 tomcat-juli 尤其是 tomcat-juli-adapters.jar 在哪里?我好像找不到他们
【解决方案2】:

我遵循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。 (我无法让它登录到它自己的附加程序)

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

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

【讨论】:

    【解决方案3】:

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

    例子:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 2023-04-04
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多