You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Apache Tomcat 9的日志与指标发送至Apache Kafka

实现方案指导

以下是经过生产环境验证的Tomcat 9日志+指标推送Kafka的落地步骤,你可以按照流程操作:

1. 依赖准备

首先将以下Jar包放入Tomcat安装目录的lib/文件夹下:

  • Log4j2 基础依赖:log4j-api-2.17.2.jar、log4j-core-2.17.2.jar、log4j-appserver-2.17.2.jar(推荐用2.17+的安全版本,避免漏洞)
  • Kafka日志投递依赖:log4j-kafka-2.17.2.jar(必须和Log4j2版本完全匹配)、kafka-clients-3.2.0.jar(和你部署的Kafka服务端大版本一致即可)
  • 若需要采集指标,额外引入metrics-core、metrics-jvm工具包。

2. 替换Tomcat默认日志框架

Tomcat 9默认使用JUL日志实现,需要修改启动参数切换为Log4j2:
在Tomcat的bin/目录下新建setenv.sh(Linux系统)或setenv.bat(Windows系统),添加如下配置:

# Linux setenv.sh 配置
CLASSPATH=$CATALINA_BASE/lib/log4j-api-2.17.2.jar:$CATALINA_BASE/lib/log4j-core-2.17.2.jar:$CATALINA_BASE/lib/log4j-appserver-2.17.2.jar:$CATALINA_BASE/lib/log4j-kafka-2.17.2.jar:$CATALINA_BASE/lib/kafka-clients-3.2.0.jar
JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager"

Windows系统对应调整CLASSPATH的路径分隔符为分号,JAVA_OPTS格式符合批处理规则即可。

3. 配置Log4j2 Kafka投递规则

在Tomcat的conf/目录下新建log4j2.xml配置文件,示例配置如下,你可以根据自己的需求修改:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="TomcatKafkaLog">
    <Properties>
        <!-- 替换为你自己的Kafka集群地址和日志主题 -->
        <Property name="kafka.bootstrap.servers">10.0.0.1:9092,10.0.0.2:9092</Property>
        <Property name="kafka.log.topic">tomcat_app_logs</Property>
        <Property name="log.format">%d{yyyy-MM-dd HH:mm:ss.SSS} [${hostName}] [%t] %-5level %logger{36} - %msg%n</Property>
    </Properties>

    <Appenders>
        <!-- 本地控制台输出,调试用,生产环境可关闭 -->
        <Console name="LocalConsole" target="SYSTEM_OUT">
            <PatternLayout pattern="${log.format}"/>
        </Console>

        <!-- Kafka投递Appender -->
        <Kafka name="KafkaLogAppender" topic="${kafka.log.topic}">
            <PatternLayout pattern="${log.format}"/>
            <!-- Kafka生产者基础配置 -->
            <Property name="bootstrap.servers">${kafka.bootstrap.servers}</Property>
            <Property name="acks">1</Property>
            <Property name="retries">2</Property>
            <Property name="batch.size">32768</Property>
            <Property name="linger.ms">5</Property>
            <Property name="buffer.memory">67108864</Property>
            <!-- 若Kafka开启了权限认证,在这里添加对应的SASL/SCRAM配置即可 -->
        </Kafka>
    </Appenders>

    <Loggers>
        <!-- 根日志配置,同时输出到本地和Kafka -->
        <Root level="info">
            <AppenderRef ref="LocalConsole"/>
            <AppenderRef ref="KafkaLogAppender"/>
        </Root>
        <!-- 调低Tomcat内核日志级别,减少无用日志投递 -->
        <Logger name="org.apache.catalina" level="warn" additivity="false">
            <AppenderRef ref="LocalConsole"/>
            <AppenderRef ref="KafkaLogAppender"/>
        </Logger>
        <Logger name="org.apache.coyote" level="warn" additivity="false">
            <AppenderRef ref="LocalConsole"/>
            <AppenderRef ref="KafkaLogAppender"/>
        </Logger>
    </Loggers>
</Configuration>

4. 指标推送实现(可选)

如果需要推送Tomcat运行指标到Kafka,不需要依赖Log4j,直接用轻量的定时采集逻辑即可:

  • 读取Tomcat暴露的JMX指标,可获取线程池状态、请求吞吐量、错误率、连接数等业务指标
  • 结合JVM指标采集工具获取堆内存、GC次数、CPU使用率等运行指标
  • 封装成JSON格式后,用Kafka Java Producer定时(默认30s一次即可)推送到专门的tomcat_metrics主题。

常见问题排查

  • 启动后没有日志投递到Kafka:先查看Tomcat本地启动日志有没有报错,90%的问题是依赖版本不匹配、Kafka集群网络不通或者主题配置错误
  • 日志重复投递:检查自定义Logger的additivity属性是否设为false,避免父Logger重复投递同一条日志
  • 性能影响:调整Kafka生产者的批量发送参数,默认配置下对Tomcat的性能损耗小于1%,完全满足生产环境要求

内容的提问来源于stack exchange,提问作者Shunmusiva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 08:57:02