如何更改 Kafka 客户端日志记录 levels/preferences?

How to change the Kafka client logging levels/preferences?

我正在使用一个普通的 Java 项目来 运行(无框架)Kafka 生产者和消费者。

我正在尝试控制由 KafkaProducerKafkaConsumer 代码生成的日志,但我无法使用 log4j.properties 配置影响它:

log4j.rootLogger=ERROR,stdout

log4j.logger.kafka=ERROR,stdout
log4j.logger.org.apache.kafka.clients.producer.ProducerConfig=ERROR,stdout
log4j.logger.org.apache.kafka.common.utils.AppInfoParser=ERROR,stdout
log4j.logger.org.apache.kafka.clients.consumer.internals.AbstractCoordinator=ERROR,stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d] %p %m (%c)%n

无论我在 log4j.properties 文件中提供什么设置,我仍然得到如下所示的日志输出:

[main] INFO org.apache.kafka.clients.producer.ProducerConfig - ProducerConfig values:
...
[main] INFO org.apache.kafka.clients.producer.ProducerConfig - ProducerConfig values:
...
[main] INFO org.apache.kafka.clients.producer.ProducerConfig - ProducerConfig values:
...
[main] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator - [Consumer clientId=UM00160, groupId=string-group] (Re-)joining group

如何控制 Kafka 客户端库的日志记录? link 我的 log4j.properties 文件到 Kafka 客户端库日志记录时我缺少什么?为了不向输出发送垃圾邮件,我必须使用 运行 Maven 测试:mvn test 2> /dev/null。我可以通过 log4j.properties.

配置吗

上下文:

我有以下相关文件:

── test
   ├── java
   │   └── com
   │       └── example
   │           ├── PropertyReader.java
   │           └── strings
   │               └── TestKafkaStringValues.java
   └── resources
       ├── application.properties
       └── log4j.properties

我正在尝试 运行 TestKafkaStringValues.java 同时使用 Maven surefire 插件(mvn test)或 Eclipse JUnit 插件(相当于 java ...)。

为了万无一失,我在 Maven pom.xml 中使用了以下配置:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <systemPropertyVariables>
            <log4j.configuration>file:log4j.properties</log4j.configuration>
        </systemPropertyVariables>
    </configuration>
</plugin>

对于 JUnit,我使用以下 Java VM 参数:-Dlog4j.configuration=log4j.properties.

我也尝试在这两种情况下使用 log4j.properties 的绝对路径。还是不行。

可以看到完整代码here.

上面代码中的问题是 Maven 运行时依赖项(缺少实际的 Log4j 日志记录实现)。在 pom 中,提供了 slf4j-simple 日志记录实现。此实现是:

  • 能够将 Kafka 日志打印到标准输出
  • 无法理解 log4j.properties-Dlog4j.* 属性。

因此,once 必须包含在 Log4J 实现中。这里可以选择 Log4j 1.x (End of life) or Log4j2.

通过以下配置,应该能够非常 comprehensive/granular 控制日志记录(包括 Kafka 客户端)。

pom.xml:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.13.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.13.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.13.1</version>
    <scope>test</scope>
</dependency>

虽然 log4j-apilog4j-core 是您需要的最低要求。为了让 Log4j2 能够 control/configure 也 libraries/components 写在 SLF4J 之上(Kafka 客户端就是这样一个库),你需要添加第三个依赖:log4j-slf4j-impl.

注意: 请注意,对于使用 SLF4J 1.8.x 及更高版本的库,您将需要此 Log4j-SLF4J 适配器的另一个版本。看到这个 for more information.

现在关于配置日志记录,Log4j2 is automatically loading the configuration files it it finds them, automatically searching in multiple locations

如果将以下 log4j2.properties 文件放在资源类路径中(主代码在 src/java/resources/ 中,测试代码在 src/test/resource 中),您将获得所需的结果:

rootLogger.level = info
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT

appenders = stdout

appender.stdout.name = STDOUT
appender.stdout.type = Console
appender.stdout.layout.type = PatternLayout
appender.stdout.layout.pattern =%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%t] %c - %m%n

loggers = kafka, kafka-consumer

logger.kafka.name = org.apache.kafka
logger.kafka.level = warn

logger.kafka-consumer.name = org.apache.kafka.clients.consumer
logger.kafka-consumer.level = info

在上面的示例中,所有日志记录都写入 stdout 并且: * 根记录器正在记录 info 及以上 * 所有 org.apache.kafka 前缀的记录器记录 warn 及以上 * 所有 org.apache.kafka.clients.consumer 前缀的记录器都在记录 info 及以上

以下是使用 Log4j2 时的一些额外观察:

  • 如果你想要 JSON 或 YAML 配置你需要额外的依赖项
  • 如果 Log4j 配置不正确,Eclipse 中的 JUnit 插件将在没有任何输出的情况下静默终止。 mvn 输出会显示错误。