我已经写了一个测试应用程序来测试Kafka。我现在正在尝试启用日志记录。
我不太了解Java应用程序中如何进行日志记录,但我的理解是,通常会使用框架。一些示例包括:
- log4j
- slf4j
- 回记
我的理解是,在大多数情况下,这些日志框架定义了一个接口库和一个实现库,以便它们可以混合和匹配。
例如,如果Kafka使用logging-api-A
,则可以使用logging-impl-B
进行实际实现,同时保持与Kafka实现代码的兼容性,该代码调用为logging-api-A
定义的API。
此外,我的理解是,通常需要一个库来“粘合”一个日志API框架和一个日志实现框架。这个库是某种类型的适配器,可以实现互操作性。
如何在使用Kafka的客户端Java代码中开启日志?
如果我从Java程序调用Kafka代码,并且出现了故障,我希望能够看到一些日志信息打印到stdout
。即使在没有故障的情况下,我仍然希望能够配置日志,以便显示信息或调试消息,记录正在执行的操作的详细信息。(例如:向Kafka发送消息应该会产生某种日志,消费消息也应该如此。连接或断开连接等......)
目前我不知道Kafka使用哪个框架来进行日志记录。网上有相互矛盾的信息。一些文章建议使用log4j,一些建议使用slf4j,还有一些建议在最近更新后使用logback。所以我对Kafka实际上是如何进行日志记录的感到困惑。
这些信息很难找到,因为Kafka本身可以用作日志记录的输出。例如,您可能编写了一个应用程序,而不是将日志转储到文件中,您可能希望将日志记录信息转储到Kafka主题中。因此很难搜索信息,因为“log”一词用于多种用途。
测试代码
这并不是特别相关,但如果有帮助的话,这里有一些我一直在使用的测试代码。
package com.myname.kafkaexample.KafkaExample;
import java.util.Properties;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
public class Main {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:29092");
properties.setProperty("default.topic", "hello-world-topic");
properties.setProperty("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.setProperty("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<>(properties);
String topicName = "hello-world-topic";
String key = "testkey";
String message = "Hello Kafka! (Message String)";
ProducerRecord<String, String> producerRecord = new ProducerRecord<>(topicName, key, message);
producer.send(producerRecord);
producer.close();
}
}
还有pom.xml
...
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.myname.kafkaexample</groupId>
<artifactId>KafkaExample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>KafkaExample</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</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>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.5.0</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.myname.kafkaexample.KafkaExample.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.5.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.myname.kafkaexample.KafkaExample.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
2条答案
按热度按时间mnemlml81#
Kafka使用Slf 4j作为logging facade。这个库允许你选择你想要使用的logging实现,所以你只需要在合适的slf 4j适配器库上添加一个依赖项,如下所述。
您的pom.xml使用log4j(v2)作为日志实现,并且似乎使用了正确的日志适配器(log4j-slf 4j 2-impl),如here所述。
368yc8dk2#
这些日志框架定义了一个接口库
是的。slf 4j是接口。其他的是2个实现,但还有其他的像
java.util.logging
(JUL)。您还需要一个用于特定实现的绑定库。
网上的信息相互矛盾。有些文章建议使用log4j,有些建议使用slf 4j
log4j1.x(不是2,就像你添加的那样)/reload 4j是Kafka使用的实现,但通过slf 4j接口使用它。
因此,很难搜索信息,因为“日志”一词有多种用途
写入控制台stdout/stderr、文件或Kafka是用log4j术语中的"appenders"完成的,而不是“logger”。
如果出现故障,我希望能够看到一些打印到stdout的日志记录信息
只有当你有一个有效的日志 * 文件 *。Java不包括一个给你。
例如,您需要
src/main/resources/log4j2.xml
(如果不存在,则在Maven项目中创建resources目录)来让您添加的log4j 2库记录任何地方的任何内容。