在连接到动物园管理员的 kafka 中发现 log4j 错误

问题描述

我正在尝试将 kafka 连接到三台机器上的 zookeeper,一台是我的笔记本电脑,另外两台是虚拟机。当我尝试使用

启动 kafka 时
bin/kafka-server-start.sh config/server.properties &

但是,它打印了以下错误

log4j:ERROR setFile(null,true) call Failed.
java.io.FileNotFoundException: /usr/local/kafka/bin/../logs/server.log (Permission denied)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:133)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    at org.apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.java:223)
    at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:842)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
    at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:648)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:514)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.slf4j.impl.Log4jLoggerFactory.<init>(Log4jLoggerFactory.java:66)
    at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
    at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
    at com.typesafe.scalalogging.Logger$.apply(Logger.scala:48)
    at kafka.utils.Log4jControllerRegistration$.<init>(Logging.scala:25)
    at kafka.utils.Log4jControllerRegistration$.<clinit>(Logging.scala)
    at kafka.utils.Logging$class.$init$(Logging.scala:47)
    at kafka.Kafka$.<init>(Kafka.scala:30)
    at kafka.Kafka$.<clinit>(Kafka.scala)
    at kafka.Kafka.main(Kafka.scala)
log4j:ERROR Either File or DatePattern options are not set for appender [kafkaAppender].
log4j:ERROR setFile(null,true) call Failed.
java.io.FileNotFoundException: /usr/local/kafka/bin/../logs/kafka-request.log (Permission denied)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:133)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    at org.apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.java:223)
    at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:842)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
    at org.apache.log4j.PropertyConfigurator.parseCatsAndRenderers(PropertyConfigurator.java:672)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:516)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.slf4j.impl.Log4jLoggerFactory.<init>(Log4jLoggerFactory.java:66)
    at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
    at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
    at com.typesafe.scalalogging.Logger$.apply(Logger.scala:48)
    at kafka.utils.Log4jControllerRegistration$.<init>(Logging.scala:25)
    at kafka.utils.Log4jControllerRegistration$.<clinit>(Logging.scala)
    at kafka.utils.Logging$class.$init$(Logging.scala:47)
    at kafka.Kafka$.<init>(Kafka.scala:30)
    at kafka.Kafka$.<clinit>(Kafka.scala)
    at kafka.Kafka.main(Kafka.scala)
log4j:ERROR Either File or DatePattern options are not set for appender [requestAppender].
log4j:ERROR setFile(null,true) call Failed.
java.io.FileNotFoundException: /usr/local/kafka/bin/../logs/kafka-authorizer.log (Permission denied)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:133)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    at org.apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.java:223)
    at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:842)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
    at org.apache.log4j.PropertyConfigurator.parseCatsAndRenderers(PropertyConfigurator.java:672)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:516)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.slf4j.impl.Log4jLoggerFactory.<init>(Log4jLoggerFactory.java:66)
    at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
    at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
    at com.typesafe.scalalogging.Logger$.apply(Logger.scala:48)
    at kafka.utils.Log4jControllerRegistration$.<init>(Logging.scala:25)
    at kafka.utils.Log4jControllerRegistration$.<clinit>(Logging.scala)
    at kafka.utils.Logging$class.$init$(Logging.scala:47)
    at kafka.Kafka$.<init>(Kafka.scala:30)
    at kafka.Kafka$.<clinit>(Kafka.scala)
    at kafka.Kafka.main(Kafka.scala)
log4j:ERROR Either File or DatePattern options are not set for appender [authorizerAppender].
log4j:ERROR setFile(null,true) call Failed.
java.io.FileNotFoundException: /usr/local/kafka/bin/../logs/controller.log (Permission denied)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:133)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    at org.apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.java:223)
    at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:842)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
    at org.apache.log4j.PropertyConfigurator.parseCatsAndRenderers(PropertyConfigurator.java:672)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:516)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.slf4j.impl.Log4jLoggerFactory.<init>(Log4jLoggerFactory.java:66)
    at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
    at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
    at com.typesafe.scalalogging.Logger$.apply(Logger.scala:48)
    at kafka.utils.Log4jControllerRegistration$.<init>(Logging.scala:25)
    at kafka.utils.Log4jControllerRegistration$.<clinit>(Logging.scala)
    at kafka.utils.Logging$class.$init$(Logging.scala:47)
    at kafka.Kafka$.<init>(Kafka.scala:30)
    at kafka.Kafka$.<clinit>(Kafka.scala)
    at kafka.Kafka.main(Kafka.scala)
log4j:ERROR Either File or DatePattern options are not set for appender [controllerAppender].
log4j:ERROR setFile(null,true) call Failed.
java.io.FileNotFoundException: /usr/local/kafka/bin/../logs/log-cleaner.log (Permission denied)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:133)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    at org.apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.java:223)
    at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:842)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
    at org.apache.log4j.PropertyConfigurator.parseCatsAndRenderers(PropertyConfigurator.java:672)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:516)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.slf4j.impl.Log4jLoggerFactory.<init>(Log4jLoggerFactory.java:66)
    at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
    at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
    at com.typesafe.scalalogging.Logger$.apply(Logger.scala:48)
    at kafka.utils.Log4jControllerRegistration$.<init>(Logging.scala:25)
    at kafka.utils.Log4jControllerRegistration$.<clinit>(Logging.scala)
    at kafka.utils.Logging$class.$init$(Logging.scala:47)
    at kafka.Kafka$.<init>(Kafka.scala:30)
    at kafka.Kafka$.<clinit>(Kafka.scala)
    at kafka.Kafka.main(Kafka.scala)
log4j:ERROR Either File or DatePattern options are not set for appender [cleanerAppender].
log4j:ERROR setFile(null,true) call Failed.
java.io.FileNotFoundException: /usr/local/kafka/bin/../logs/state-change.log (Permission denied)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:133)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    at org.apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.java:223)
    at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:842)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
    at org.apache.log4j.PropertyConfigurator.parseCatsAndRenderers(PropertyConfigurator.java:672)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:516)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.slf4j.impl.Log4jLoggerFactory.<init>(Log4jLoggerFactory.java:66)
    at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
    at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
    at com.typesafe.scalalogging.Logger$.apply(Logger.scala:48)
    at kafka.utils.Log4jControllerRegistration$.<init>(Logging.scala:25)
    at kafka.utils.Log4jControllerRegistration$.<clinit>(Logging.scala)
    at kafka.utils.Logging$class.$init$(Logging.scala:47)
    at kafka.Kafka$.<init>(Kafka.scala:30)
    at kafka.Kafka$.<clinit>(Kafka.scala)
    at kafka.Kafka.main(Kafka.scala)
log4j:ERROR Either File or DatePattern options are not set for appender [stateChangeAppender].
[2021-01-11 11:29:34,962] INFO Registered kafka:type=kafka.Log4jController MBean (kafka.utils.Log4jControllerRegistration$)
[2021-01-11 11:29:35,126] INFO Registered signal handlers for TERM,INT,HUP (org.apache.kafka.common.utils.LoggingSignalHandler)
[2021-01-11 11:29:35,126] INFO starting (kafka.server.KafkaServer)
[2021-01-11 11:29:35,126] INFO Connecting to zookeeper on jyy-lenovo-legion:2181,pro1:2181,pro2:2181 (kafka.server.KafkaServer)
[2021-01-11 11:29:35,141] INFO [ZooKeeperClient Kafka server] Initializing a new session to jyy-lenovo-legion:2181,pro2:2181. (kafka.zookeeper.ZooKeeperClient)
[2021-01-11 11:29:35,144] INFO Client environment:zookeeper.version=3.5.7-f0fdd52973d373ffd9c86b81d99842dc2c7f660e,built on 02/10/2020 11:30 GMT (org.apache.zookeeper.ZooKeeper)
[2021-01-11 11:29:35,144] INFO Client environment:host.name=jyy-lenovo-legion (org.apache.zookeeper.ZooKeeper)
[2021-01-11 11:29:35,144] INFO Client environment:java.version=1.8.0_271 (org.apache.zookeeper.ZooKeeper)
[2021-01-11 11:29:35,144] INFO Client environment:java.vendor=Oracle Corporation (org.apache.zookeeper.ZooKeeper)
[2021-01-11 11:29:35,144] INFO Client environment:java.home=/usr/local/jdk1.8.0_271/jre (org.apache.zookeeper.ZooKeeper)

我的zoo.cfg:

tickTime=2000
initLimit=5
synclimit=5
dataDir=/usr/local/zookeeper/zkData
clientPort=2181
server.1=pro1:2888:3888
server.2=pro2:2888:3888
server.3=jyy-lenovo-legion:2888:3888

我的 kafka/config/server.properties:

broker.id=0
host.name=jyy-lenovo-legion
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/usr/local/kafka/tmp/kafka-logs
num.partitions=1
zookeeper.connect=jyy-lenovo-legion:2181,pro2:2181
port=9092
group.initial.rebalance.delay.ms=0

暂时,我没有找到任何特定或接近我的问题的解决方案。另外,我对kafka、zookeepero和hadoop相关的大数据工具都是新手,所以这个问题真的很困扰我。有人可以提供一些帮助吗?

解决方法

这些异常与 ZooKeeper 无关。它们由 log4j 抛出,因为它不允许写入指定的文件。这些不应该阻止 Kafka 运行,但显然你不会得到 log4j 日志。

使用 bin/kafka-server-start.sh 启动 Kafka 时,会使用默认的 log4j 配置文件 log4j.properties。这会尝试将日志写入 ../logs/,请参阅 https://github.com/apache/kafka/blob/trunk/bin/kafka-run-class.sh#L194-L197

在您的情况下,此路径是 /usr/local/kafka/bin/../logs 并且不允许 Kafka 在那里写入。

您可以通过将 LOG_DIR 环境变量设置为允许 Kafka 写入日志的路径来更改默认路径,例如:

export LOG_DIR=/var/log/kafka/
bin/kafka-server-start.sh config/server.properties &