当前位置: 首页 > 知识库问答 >
问题:

转换log4j。Tomcat使用Log4j2的属性文件

万俟丁雷
2023-03-14

我试图配置Tomcat 8使用Log4j2进行日志记录。

我找到了使用Log4j登录Tomcat的参考资料。它提供了一个示例log4j。将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架构页面,但是我还没有找到多少关于如何在Log4j2中进行这种容器映射的资料。

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

共有3个答案

宁卓
2023-03-14

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

例子:

阿佩德。文件fileName=${sys:catalina.base}/logs/XXX。日志

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

古刚洁
2023-03-14

我遵循了使用Log4j在Tomcat中日志记录的参考,并向bin dir添加了tomcat-juli.jar,还向lib dir添加了tomcat-juli-adapters.jar。之后,我将log4j-api-2.1.jar、log4j-core-2.1.jar和log4j-1.2-api-2.1.jar添加到lib dir。

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

<?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中获得所有日志记录。日志我还在努力让accessLog也这么做
编辑:我找到了这个网站。通过这种方式,您可以直接访问catalina日志。日志(我无法让它登录到自己的appender)

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

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

斜昊空
2023-03-14

问了这个问题之后,我花了更多的时间设置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>

但是,要使其正常工作,需要正确配置大量其他文件。tomcat 7使用log4j2进行内部日志记录。Paramita Banerjee的xml帖子对此很有帮助。

这个文件在CATALINA_HOME/bin/中:

  • tomcatjuli。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应用程序一起部署)-它的使用在Web应用程序中使用Log4j 2中进行了描述。仅当您有使用旧log4j 1.2接口的应用程序。

CATALINA_BASE/conf中,我禁用了日志记录。属性

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

正如Nick在回复中提到的,还有访问日志的输出。我也没试过用它做任何事。

我希望其他人觉得这有用。回想起来,这似乎很简单。然而,有很多部分必须“恰到好处”才能工作,这是一个挑战(至少对新手来说)。

 类似资料:
  • 我正在使用log4j2进行一个项目,我的log4j2中有一些值。可配置的属性。该项目还将包括其他组件的配置文件。理想情况下,我希望将所有配置保存在一个地方,以便能够在同一个文件中为log4j设置那些可配置的值,这样我就不会有两个不同的地方更改配置值(例如,包括环境变量)。 我在这方面找到的方法并不理想,比如让我的项目的其他部分从主配置文件中读取值,并将它们放入系统变量中,由log4j获取,因为我希

  • 我有一个使用log4j的java应用程序,配置如下。 log4j.properties 我想使用与上面相同的配置迁移到log4j2。尚未找到任何与log4j2属性配置文件相关的内容,因为最近包含了此支持。 谁能帮我弄清楚我的log4j2怎么样。属性文件是否具有上述相同的配置?

  • 我在哪里可以找到默认的log4j配置文件的工人和驱动程序? 1) 目前Spark正在将执行器/工作者(stdout/stderr)级别的日志记录到工作文件夹,并将驱动程序级别的日志记录到日志文件夹。 我在哪里可以找到这个配置? 我尝试将Log4j2用于spark,而不是log4j。我正在尝试获取默认属性文件,以便可以将其中的一些内容复制到log4j2属性XML。 2) 另外,是否可以修改当前正在运

  • 但是房产没有被选中。例如,下面的代码创建一个${log-path}文件夹来存储日志文件,而不是所需的logs文件夹。 我做错了什么?

  • 问题内容: 我已将应用程序迁移到log4j 2,并通过log4j2.xml对其进行了配置 但是,我正在使用的某些库取决于log4j1。如果我使用以下命令运行该应用程序: log4j 1抱怨找不到配置文件。我正在使用log4j 2,log4j-1.2-api-2.0-rc1.jar提供的log4j 1.x桥。是否可以使用单个log4j2.xml进行配置? 我尝试过的替代方法是同时配置log4j和lo

  • 我已经将应用程序迁移到Log4J2,并通过log4j2.xml对其进行了配置 但是,我使用的一些库依赖于log4j1。如果我使用以下方式运行应用程序: 我尝试的另一种方法是将log4j和log4j2配置在一起: 我担心的是日志配置文件和输出的碎片化。我还担心log4j.xml和log4j2.xml之间可能存在的冲突。例如,logfile Error.log被配置为使用log4j1中的FileApp