Kafka如何在Java中启用日志记录

bvn4nwqk  于 2023-04-19  发布在  Java
关注(0)|答案(2)|浏览(316)

我已经写了一个测试应用程序来测试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>
mnemlml8

mnemlml81#

Kafka使用Slf 4j作为logging facade。这个库允许你选择你想要使用的logging实现,所以你只需要在合适的slf 4j适配器库上添加一个依赖项,如下所述。
您的pom.xml使用log4j(v2)作为日志实现,并且似乎使用了正确的日志适配器(log4j-slf 4j 2-impl),如here所述。

368yc8dk

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库记录任何地方的任何内容。

<?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>
    </Appenders>
    <Loggers>
        <Root level="DEBUG"> <!-- everything as debug -->
            <AppenderRef ref="Console"/>
        </Root>
        <Logger name="org.apache.kafka" level="INFO"/>  <!-- except internal kafka packages -->
    </Loggers>
</Configuration>

相关问题