使用Log4j的Append功能将日志传输到Kafka
灵感
我想知道是否可以通过Java应用程序的日志进行数据分析,所以我首先研究了收集日志的方法。
虽然也可以使用其他库进行类似操作,但我首先注意到的是Log4j,所以我正在验证它是否可行。
结果是可以的,但这将使应用程序增加对外部库的依赖。
环境
-
- JDK 8 以上
-
- kafka-client-3.2.0
-
- log4j-api-2.17.2
-
- log4j-core-2.17.2
-
- log4j-iostream-2.17.2
-
- log4j-slf4j-impl-2.17.2
-
- log4j-web-2.17.2
-
- lz4-java-1.8.0
-
- slf4j-api-1.7.36
-
- snappy-java-1.1.8.4
-
- tjconsole-1.7-all
- zstd-jni-1.5.2-1
进行
请使用下面的源代码。
这段代码只涉及输出逻辑。
package com.tutorial;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Main {
private static final Logger logger = LogManager.getLogger(Main.class);
public static void main(String[] args) {
System.out.println("Initial RUnnn");
logger.info("test runun!");
}
}
以下是log4j的XML配置。
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<Kafka name="Kafka" topic="quickstart-events">
<PatternLayout pattern="%date %message"/>
<Property name="bootstrap.servers">localhost:9092</Property>
</Kafka>
</appenders>
<loggers>
<logger name="com.tutorial.Main" level="trace">
<appender-ref ref="Console"/>
<appender-ref ref="Kafka"/>
</logger>
<root level="error">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
确认行动
结束
使用Log4j的Append功能导致需要额外的库,如kafka-client、slf4j等。虽然log4j是从JDK6开始可用的库,但kafka-client的最低要求JDK版本是8,如果使用JDK6,将会受到限制。
对于不想修改现有资产的情况,这是一种有效的方法,可以避免在应用程序中添加额外的源代码以进行数据汇总。但由于使用了Kafka,可能会发生额外的管理问题和向Kafka发送应用程序日志导致意外错误的可能性。
其他日志库,如Logback,似乎也可以做到,所以您可以根据个人喜好进行选择。