Confluent Docker log4j日志记录器级别配置

5

我正在使用confluentinc/cp-kafka Docker镜像本地运行Kafka,并设置以下日志容器环境变量:

KAFKA_LOG4J_ROOT_LOGLEVEL: ERROR
KAFKA_LOG4J_LOGGERS: >-
    org.apache.zookeeper=ERROR,
    org.apache.kafka=ERROR,
    kafka=ERROR,
    kafka.cluster=ERROR,
    kafka.controller=ERROR,
    kafka.coordinator=ERROR,
    kafka.log=ERROR,
    kafka.server=ERROR,
    kafka.zookeeper=ERROR,
    state.change.logger=ERROR

我在Kafka日志中看到Kafka使用以下配置启动:

===> ENV Variables ...
ALLOW_UNSIGNED=false
COMPONENT=kafka
CONFLUENT_DEB_VERSION=1
CONFLUENT_PLATFORM_LABEL=
CONFLUENT_VERSION=5.4.1
...
KAFKA_LOG4J_LOGGERS=org.apache.zookeeper=ERROR, org.apache.kafka=ERROR, kafka=ERROR, kafka.cluster=ERROR, kafka.controller=ERROR, kafka.coordinator=ERROR, kafka.log=ERROR, kafka.server=ERROR, kafka.zookeeper=ERROR, state.change.logger=ERROR
KAFKA_LOG4J_ROOT_LOGLEVEL=ERROR
...

然而在日志中我仍然看到更深层次的INFOTRACE日志级别,例如:

[2020-03-26 16:22:12,838] INFO [Controller id=1001] Ready to serve as the new controller with epoch 1 (kafka.controller.KafkaController)
[2020-03-26 16:22:12,848] INFO [Controller id=1001] Partitions undergoing preferred replica election:  (kafka.controller.KafkaController)
[2020-03-26 16:22:12,849] INFO [Controller id=1001] Partitions that completed preferred replica election:  (kafka.controller.KafkaController)
[2020-03-26 16:22:12,855] INFO [Controller id=1001] Skipping preferred replica election for partitions due to topic deletion:  (kafka.controller.KafkaController)

如何在某个特定级别以下真正停用日志记录?在上面的示例中,我只想要ERROR日志。
  • 上述方法是Confluent文档中描述的方法。
  • 而Apache Kafka 源代码列出了各种日志记录器,我无法使用KAFKA_LOG4J_LOGGERS Docker环境变量来影响它们。

你只看到控制器的INFO级别日志吗? - Giorgos Myrianthous
@GiorgosMyrianthous 除了控制器之外,还有其他问题。与此同时,我已经找到了解决方法。请查看我发布的答案。 - Gabriel Petrovay
1个回答

10
我检查了Dockerfile并检查了Kafka容器。这种行为的原因是YAML多行字符串折叠。因此提供的环境变量(使用YAML多行值)在运行时为:
KAFKA_LOG4J_LOGGERS=org.apache.zookeeper=ERROR, org.apache.kafka=ERROR, kafka=ERROR, kafka.cluster=ERROR, kafka.controller=ERROR, kafka.coordinator=ERROR, kafka.log=ERROR, kafka.server=ERROR, kafka.zookeeper=ERROR, state.change.logger=ERROR

取代(标签之间不要有空格):

KAFKA_LOG4J_LOGGERS=org.apache.zookeeper=ERROR,org.apache.kafka=ERROR, kafka=ERROR, kafka.cluster=ERROR,kafka.controller=ERROR, kafka.coordinator=ERROR,kafka.log=ERROR,kafka.server=ERROR,kafka.zookeeper=ERROR,state.change.logger=ERROR

这可以在生成的/etc/kafka/log4j.properties文件中查看:

log4j.rootLogger=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.logger.kafka.authorizer.logger=WARN
log4j.logger.kafka.cluster=ERROR
log4j.logger.kafka.producer.async.DefaultEventHandler=DEBUG
log4j.logger.kafka.zookeeper=ERROR
log4j.logger.org.apache.kafka=ERROR
log4j.logger.kafka.coordinator=ERROR
log4j.logger.org.apache.zookeeper=ERROR
log4j.logger.kafka.log.LogCleaner=INFO
log4j.logger.kafka.controller=ERROR
log4j.logger.kafka=INFO
log4j.logger.kafka.log=ERROR
log4j.logger.state.change.logger=ERROR
log4j.logger.kafka=ERROR
log4j.logger.kafka.server=ERROR
log4j.logger.kafka.controller=TRACE
log4j.logger.kafka.network.RequestChannel$=WARN
log4j.logger.kafka.request.logger=WARN
log4j.logger.state.change.logger=TRACE

如果您需要在YAML多行值中分割长行,您必须使用这个YAML语法
代码的一些提示:
  • 这里是当confluent容器运行时生成log4j.properties文件的位置。
  • 这些是Kafka将启动的默认日志级别。
  • 这些应该是Kafka支持的所有记录器。

3
注意:空格很重要。log4j.logger.kafka.log=ERROR 可能不会被加载。 - OneCricketeer
1
请注意,在您的一行示例中,没有空格实际上是有空格的。应该是: KAFKA_LOG4J_LOGGERS:org.apache.zookeeper=ERROR,org.apache.kafka=ERROR,kafka=ERROR,kafka.cluster=ERROR,kafka.controller=ERROR,kafka.coordinator=ERROR,kafka.log=ERROR,kafka.server=ERROR,kafka.zookeeper=ERROR,state.change.logger=ERROR - ChrisO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接