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


    前言

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

    官网文档:Log4j – Log4j 2 Appenders

    依赖

    1. <!-- kafka client -->
    2. <dependency>
    3. <groupId>org.apache.kafka</groupId>
    4. <artifactId>kafka-clients</artifactId>
    5. <version>2.0.0</version>
    6. </dependency>
    7. <!-- 支持 scala -->
    8. <dependency>
    9. <groupId>org.apache.logging.log4j</groupId>
    10. <artifactId>log4j-api-scala_2.12</artifactId>
    11. <version>11.0</version>
    12. </dependency>
    13. <!-- 核心依赖 -->
    14. <dependency>
    15. <groupId>org.apache.logging.log4j</groupId>
    16. <artifactId>log4j-api</artifactId>
    17. <version>2.20.0</version>
    18. </dependency>
    19. <dependency>
    20. <groupId>org.apache.logging.log4j</groupId>
    21. <artifactId>log4j-core</artifactId>
    22. <version>2.20.0</version>
    23. </dependency>

    配置

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

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

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <Configuration status="INFO">
    3. <Properties>
    4. <Property name="kafkaServers">localhost:9092</Property>
    5. </Properties>
    6. <Appenders>
    7. <!-- 定义 Kafka Appender -->
    8. <Kafka name="KafkaAppender" syncSend="false" topic="recomm-system-log">
    9. <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
    10. <!-- 在此处配置 Kafka 的连接信息 -->
    11. <Property name="bootstrap.servers">${kafkaServers}</Property>
    12. </Kafka>
    13. <Console name="ConsoleAppender" target="SYSTEM_OUT">
    14. <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
    15. </Console>
    16. </Appenders>
    17. <Loggers>
    18. <Root level="info">
    19. <!-- 将日志记录到控制台 Appender -->
    20. <AppenderRef ref="ConsoleAppender" />
    21. </Root>
    22. <Logger name="log2kafka.KafkaSender$">
    23. <Appender-ref ref="KafkaAppender"/>
    24. </Logger>
    25. </Loggers>
    26. </Configuration>

    例子

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

    1. package log2kafka
    2. import org.apache.logging.log4j.scala.Logging
    3. object KafkaSender extends Logging {
    4. def send(msg:Any): Unit ={
    5. logger.info(msg.toString)
    6. }
    7. def main(args: Array[String]): Unit = {
    8. logger.info("print msg to kafka")
    9. }
    10. }

    kafka 命令行查看数据:

    1. (base) ➜ temp kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic testlog
    2. 2023-08-30 19:42:05 INFO KafkaSender$:12 - print msg to kafka
  • 相关阅读:
    【Linux详解】——进程概念
    2022最新JUC+多线程面试题
    ​MPV,汽车产品里一个特殊品类的进化过程
    Python课设-学生信息管理系统
    详解 Calico 三种模式(与 Fannel 网络对比学习)
    堆排序算法用数组模拟二叉树,求A[K](K>0)的父节点坐标
    OAuth2授权服务器Id Server一键生成配置原理
    2022CTF培训(三)windows&linux&安卓平台调试机制原理
    typescript17-函数可选参数
    07OpenCV 图像模糊
  • 原文地址:https://blog.csdn.net/u010454030/article/details/132589450