Log4j2 配置日志记录发送到 kafka 中

前言

log4j2 在 2.11.0 之后的版本,已经内置了 KafkaAppender 支持可以将打印的日志直接发送到 kafka 中,在这之前如果想要集中收集应用的日志,就需要自定义一个 Layout 来实现,相对来说还是比较麻烦的。

官网文档:Log4j -- Log4j 2 Appenders

依赖

复制代码
				<!-- kafka client -->
				<dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>2.0.0</version>
        </dependency>

				<!-- 支持 scala -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api-scala_2.12</artifactId>
            <version>11.0</version>
        </dependency>

			   <!-- 核心依赖 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.20.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.20.0</version>
        </dependency>

配置

注意这里有个 syncSend 控制着是否异步发送,false 使用异步发送也就是会攒小批发送,拥有更高的吞吐量,但相对来说延迟也会增加,建议生产环境开启,本地环境关闭,否则可能会出现程序结束了直接退出,导致 kafka 的批攒的数据没有来得及发送,自然也会导致数据丢失。

此外,如果不想每个类的日志都采集到 kafaka 里面,我们可以定义个类,通过这个类发送的日志才收集到 kafka 里面,可以参考下面的配置例子。

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Properties>
        <Property name="kafkaServers">localhost:9092</Property>
    </Properties>
    <Appenders>
        <!-- 定义 Kafka Appender -->
        <Kafka name="KafkaAppender" syncSend="false" topic="recomm-system-log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
            <!-- 在此处配置 Kafka 的连接信息 -->
            <Property name="bootstrap.servers">${kafkaServers}</Property>
        </Kafka>

        <Console name="ConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
        </Console>

    </Appenders>
    <Loggers>

        <Root level="info">
            <!-- 将日志记录到控制台 Appender -->
            <AppenderRef ref="ConsoleAppender" />
        </Root>

        <Logger name="log2kafka.KafkaSender$">
            <Appender-ref ref="KafkaAppender"/>
        </Logger>
    </Loggers>
</Configuration>

例子

这里用的是 scala,如果是 java 基本大同小异

复制代码
package log2kafka
import org.apache.logging.log4j.scala.Logging

object KafkaSender extends Logging {

  def  send(msg:Any): Unit ={
    logger.info(msg.toString)
  }

  def main(args: Array[String]): Unit = {

    logger.info("print msg to kafka")

  }

}

kafka 命令行查看数据:

复制代码
(base) ➜  temp kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic testlog
2023-08-30 19:42:05 INFO  KafkaSender$:12 - print msg to kafka
相关推荐
Simon_lca19 小时前
突破合规瓶颈:ZDHC Supplier to Zero(工厂零排放 - 进阶型)体系全攻略
大数据·网络·人工智能·分类·数据挖掘·数据分析·零售
黄焖鸡能干四碗21 小时前
网络安全建设实施方案(Word文件参考下载)
大数据·网络·人工智能·安全·web安全·制造
云境筑桃源哇1 天前
马踏春风 为爱启航 | 瑞派宠物医院(南部新城旗舰店)盛大开业!打造宠物医疗新标杆!
大数据·宠物
xixixi777771 天前
2026 年 03 月 20 日 AI+通信+安全行业日报(来更新啦)
大数据·人工智能·安全·ai·大模型·通信
F36_9_1 天前
大数据治理平台选型避坑:2026 年 8 大主流系统实测
大数据·数据治理
成长之路5141 天前
【实证分析】A股上市公司企业劳动力需求数据集(2000-2023年)
大数据
奔跑的呱呱牛1 天前
GeoJSON 在大数据场景下为什么不够用?替代方案分析
java·大数据·servlet·gis·geojson
Lab_AI1 天前
电池材料行业数据管理新突破:AI4S驱动的科学数据平台正在重塑电池材料开发范式
大数据·人工智能·ai4s·电池材料开发·电池材料研发·电池材料创新·ai材料研发
FindAI发现力量1 天前
智能工牌:线下销售场景的数字化赋能解决方案
大数据·人工智能·销售管理·ai销售·ai销冠·销售智能体
故事和你911 天前
sdut-python-实验四-python序列结构(21-27)
大数据·开发语言·数据结构·python·算法