• 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
  • 相关阅读:
    Kafka
    【愚公系列】2022年11月 Redis数据库-Lua脚本的使用
    目前的一些关于机器学习的感悟
    基于webapi的websocket聊天室(番外二)
    2024最新最全【大模型学习路线规划】零基础入门到精通!
    博客摘录「 【Linux】线程池」2023年10月14日
    【Leetcode】204. 计数质数
    【Python小项目之Tkinter应用】随机点名/抽奖工具小优化:实现输入框人数限定与人名显示优化,保证结果人名在窗口内显示,如果内容显示超出则弹出警告窗口
    基于antd实现动态修改节点的Tree组件
    ubuntu22.04 x11窗口环境手势控制
  • 原文地址:https://blog.csdn.net/u010454030/article/details/132589450