tomcat - 为 Tomcat 转换 log4j.properties 文件以使用 Log4j2

标签 tomcat logging log4j2

我正在尝试将 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 配置中那样。

最佳答案

在问了这个问题之后,我又花了一些时间来设置 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 Applications . log4j-1.2-api-2.1.jar 仅当您的应用程序使用 较旧的 log4j 1.2 接口(interface)。

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

我使用以下 setenv.sh 脚本来定义 CLASSPATHLOGGING_MANAGER Tomcat 的正确环境变量。它要么进入 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"

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

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

关于tomcat - 为 Tomcat 转换 log4j.properties 文件以使用 Log4j2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27711703/

相关文章:

java - 修改静态资源的服务路径

java - 升级tomcat 7到tomcat 8.5

python - 使用流重定向 python 日志消息

java - 如何将 GC 重定向到 log4j2?

java - Log4j2/Slf4j 和 Java 11

java - Tomcat 消耗非常高的 CPU 使用率

java - 如何对在 Apache Tomcat 上运行的 war 应用程序使用版本控制

node.js - Nest.JS LoggerService 接口(interface)实现使用 Winston 记录器需要在消费者类中实例化实现

haskell - 在 Yesod 中记录响应时间

java - Log4j2 创建日志文件但不写入它