如何更改 Kafka 客户端日志记录 levels/preferences?
How to change the Kafka client logging levels/preferences?
我正在使用一个普通的 Java 项目来 运行(无框架)Kafka 生产者和消费者。
我正在尝试控制由 KafkaProducer
和 KafkaConsumer
代码生成的日志,但我无法使用 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-api
和 log4j-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
输出会显示错误。
我正在使用一个普通的 Java 项目来 运行(无框架)Kafka 生产者和消费者。
我正在尝试控制由 KafkaProducer
和 KafkaConsumer
代码生成的日志,但我无法使用 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-api
和 log4j-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
输出会显示错误。