【问题标题】:How-To: Configure Tomcat 9 to log via Log4j2操作方法:配置 Tomcat 9 以通过 Log4j2 登录
【发布时间】:2023-09-16 10:18:01
【问题描述】:

如何将 Tomcat 9 的内部日志记录(catalina 和 localhost)重定向到 Log4j2?

虽然有许多适用于旧版本 Tomcat 和 Log4j 的指南,但我找不到任何关于 Tomcat 9 和 Log4j2 的“完整”指南; Apache Tomcat 9 documentation 指向“替代日志框架提供的说明”,Apache Log4j documentation 状态(2. 中的 jar 名称已更正):

Log4j 可以用作 Apache Tomcat 的日志框架。这 通过包含 log4j-api 自动实现支持, 引导类路径中的 log4j-core 和 log4j-appserver jar。一份文件 命名为 log4j2-tomcat.xml、log4j2-tomcat.json、log4j2-tomcat.yaml、 log4j2-tomcat.yml 或 log4j2-tomcat.properties 也必须放在 引导类路径。这最容易通过以下方式完成:

  1. 在 catalina home 中创建一组名为 log4j2/lib 和 log4j2/conf 的目录。
  2. 将 log4j-api-2.12.0.jar、log4j-core-2.12.0.jar 和 log4j-appserver-2.12.0.jar 放在 log4j2/lib 目录中。
  3. 在中创建名为 log4j2-tomcat.xml、log4j2-tomcat.json、log4j2-tomcat.yaml、log4j2-tomcat.yml 或 log4j2-tomcat.properties 的文件 log4j2/conf 目录。
  4. 在tomcat bin 目录中创建或修改setenv.sh 以包含CLASSPATH=$CATALINA_HOME/log4j2/lib/*:$CATALINA_HOME/log4j2/conf

但是要在 log4j2-tomcat.* 配置文件中添加什么?

【问题讨论】:

    标签: java linux log4j2 tomcat9


    【解决方案1】:

    我在Apache Tomcat 7 documentation 中找到了一个示例属性文件,但由于这是用于 Log4j 1.x 的,因此我必须将其调整为 Log4j2 属性文件语法。结果如下:

    # 'status' refers to log messages from Log4j2 itself
    monitorInterval = 30
    status = warn
    
    property.loglevel.catalina = info
    property.loglevel.localhost = info
    
    property.layoutPattern.catalina = %d %-5p [%t] %-22.22c{1} %m%n
    property.layoutPattern.localhost = %d %-5p [%t] %-30.30c{1} %m%n
    
    # Roll-over the logs once per month using CronTriggerPolicy.
    
    property.fileDatePattern.catalina = %d{yyyy-MM}
    property.fileDatePattern.localhost = %d{yyyy-MM}
    
    property.cronTriggerSchedule.catalina = 0 0 0 1 * ?
    property.cronTriggerSchedule.localhost = 0 0 0 1 * ?
    
    ## Appenders
    
    # N.B.: - No need to specify 'appenders = CATALINA, LOCALHOST, CONSOLE'
    #         since these identifiers do not contain '.' characters.
    #       - The sub-component identifiers 'policies' and 'cron' are arbitrarily
    #         chosen; the actual type is specified via the 'type' attribute.
    #       - 'DirectWriteRolloverStrategy' is used automatically since no 'fileName' specified.
    
    appender.CATALINA.type = RollingFile
    appender.CATALINA.name = RollingFile-CATALINA
    appender.CATALINA.filePattern = ${sys:catalina.base}/logs/catalina.${fileDatePattern.catalina}.log
    appender.CATALINA.layout.type = PatternLayout
    appender.CATALINA.layout.pattern = ${layoutPattern.catalina}
    appender.CATALINA.policies.type = Policies
    appender.CATALINA.policies.cron.type = CronTriggeringPolicy
    appender.CATALINA.policies.cron.schedule = ${cronTriggerSchedule.catalina}
    appender.CATALINA.policies.cron.evaluateOnStartup = true
    appender.CATALINA.filePermissions = rw-r-----
    appender.CATALINA.fileOwner = tomcat
    appender.CATALINA.fileGroup = adm
    
    appender.LOCALHOST.type = RollingFile
    appender.LOCALHOST.name = RollingFile-LOCALHOST
    appender.LOCALHOST.filePattern = ${sys:catalina.base}/logs/localhost.${fileDatePattern.localhost}.log
    appender.LOCALHOST.layout.type = PatternLayout
    appender.LOCALHOST.layout.pattern = ${layoutPattern.localhost}
    appender.LOCALHOST.policies.type = Policies
    appender.LOCALHOST.policies.cron.type = CronTriggeringPolicy
    appender.LOCALHOST.policies.cron.schedule = ${cronTriggerSchedule.localhost}
    appender.LOCALHOST.policies.cron.evaluateOnStartup = true
    appender.LOCALHOST.filePermissions = rw-r-----
    appender.LOCALHOST.fileOwner = tomcat
    appender.LOCALHOST.fileGroup = adm
    
    # Uncomment if you want to keep logging to catalina.out after Log4j2 takes over.
    
    #appender.CONSOLE.type = Console
    #appender.CONSOLE.name = STDOUT
    #appender.CONSOLE.layout.type = PatternLayout
    
    ## Configure which loggers log to which appenders
    
    rootLogger.level = ${loglevel.catalina}
    rootLogger.appenderRef.CATALINA.ref = RollingFile-CATALINA
    #rootLogger.appenderRef.stdout.ref = STDOUT
    
    # Here, the identifier does contain '.' characters, so we must specify the list.
    loggers = org.apache.catalina.core.ContainerBase.[Catalina].[localhost]
    
    logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].name = LOCALHOST
    logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = ${loglevel.localhost}
    logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].appenderRef.LOCALHOST.ref = RollingFile-LOCALHOST
    

    我使用 Log4j2 的主要原因是能够获得每月日志轮换,但即使不重新启动 Tomcat,您也可以轻松调整所有内容。

    【讨论】:

    • 有没有办法让它使用我们现有的 xml 配置?
    • xml 配置是为了什么? Log4j?
    • @Christoph 你能帮我解决这个问题吗?我需要将 log4j1 中的精确配置文件翻译成 log4j2。在文档中似乎属性的标准格式是 xml 文件而不是 file.properites ...这是正确的吗?我的第一个选择是将 log4j 与 tomcat9 一起使用,但我没有使用它.....:askubuntu.com/questions/1324010/tomcat-9-logging-with-log4j
    • log4j2 支持 xml、yaml、json 和 .properties,你想用什么由你决定。查看 log4j1 .properties 文件(它在我的答案的第一句话中链接)并将其与我的 log4j2 版本进行比较。你会注意到e。 G。这些转换:log4j.appender -> appender,.layout = org.apache.log4j.PatternLayout -> .layout.type = PatternLayout,.layout.ConversionPattern -> .layout.pattern,.File = ${catalina.base}/日志/catalina -> .filePattern = ${sys:catalina.base}/logs/catalina.%d{yyyy-MM-dd}.log, .DatePattern = '.'yyyy-MM-dd'.log' ->删除。
    • @Eduardo Gutierrez 如果您需要进一步的帮助,请告诉我,然后我将编辑我的答案并详细解释翻译步骤。
    【解决方案2】:

    要使用 log4j2 安装 Tomcat 9.0.54+,请完成以下操作:

    1. 激活 JDK JUL 桥 - https://logging.apache.org/log4j/2.x/log4j-jul/

    要使用 JDK Logging Adapter,您必须设置系统属性 java.util.logging.manager 到 org.apache.logging.log4j.jul.LogManager 这必须通过命令行来完成(即,使用 -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager 参数)或在进行任何调用之前使用 System.setProperty() 到 LogManager 或 Logger。

    1. 将所有必要的 log4j2 jar 复制到类路径或 /lib 中
    2. 配置-Dlog4j.configurationFile=/your/path/logger.xml 像下面的例子
    <?xml version="1.0" encoding="utf-8"?>
    <!-- ================================================ -->
    <!--               Tomcat log4j2 logger               -->
    <!-- ================================================ -->
    <Configuration status="INFO" monitorInterval="60">
        <Properties>
            <Property name="logsdir">${sys:catalina.base}/logs</Property>
            <Property name="layout">[%d][%p][%c:%L:%M] - %m%n</Property>
        </Properties>
        <Appenders>
            <Console name="DEFAULT" target="SYSTEM_OUT">
                <PatternLayout pattern="${layout}"/>
            </Console>
            <Async name="ASYNC-DEFAULT" includeLocation="true">
                <AppenderRef ref="DEFAULT"/>
                <AppenderRef ref="INTOFILE"/>
            </Async>
            <RollingFile name="INTOFILE"
                         fileName="${logsdir}/worker.log"
                         filePattern="${logsdir}/catalina.%d{yyyy-MM-dd}-%i.log">
                <PatternLayout pattern="${layout}"/>
                <Policies>
                    <TimeBasedTriggeringPolicy/>
                    <SizeBasedTriggeringPolicy size="10 MB"/>
                </Policies>
                <DefaultRolloverStrategy max="100"/>
            </RollingFile>
        </Appenders>
        <Loggers>
            <!-- OFF -->
    
            <!-- ERROR -->
    
            <!-- WARN -->
    
            <!-- INFO -->
            <logger name="org.apache.catalina" level="INFO"/>
            <logger name="org.apache.catalina.core" level="INFO"/>
            <logger name="org.apache.tomcat" level="INFO"/>
            <logger name="org.apache.coyote" level="INFO"/>
            <logger name="org.apache.jasper" level="INFO"/>
    
            <!-- DEBUG -->
            <logger name="org.apache.catalina.startup" level="DEBUG"/>
            <logger name="org.apache.tomcat1" level="DEBUG"/>
    
    
            <Root level="TRACE">
                <AppenderRef ref="ASYNC-DEFAULT"/>
            </Root>
        </Loggers>
    </Configuration>
    
    

    【讨论】: