[ https://issues.apache.org/jira/browse/KAFKA-17254?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Krishna V Reddy resolved KAFKA-17254. ------------------------------------- Assignee: Krishna V Reddy Resolution: Not A Problem > Kafka Server/CLI no longer respects log4j.properties/tools-log4j.properties > file > -------------------------------------------------------------------------------- > > Key: KAFKA-17254 > URL: https://issues.apache.org/jira/browse/KAFKA-17254 > Project: Kafka > Issue Type: Bug > Components: admin, logging, tools > Affects Versions: 3.8.0, 3.7.1 > Reporter: Krishna V Reddy > Assignee: Krishna V Reddy > Priority: Major > Attachments: 螢幕快照 2024-08-05 10-55-02.png > > > Kafka CLI tools and Kafka server for that matter no longer seem to respect > *KAFKA_LOG4J_OPTS* environment variable starting from v3.7.1 in Kraft mode > and seems to always log data to console. This regression only started > happening from 3.7.1 as rolling back to 3.7.0 fixes this issue. > Here's an example where we list kafka topics using kafka CLI tool in v3.7.1: > {code:java} > bash-4.4$ bin/kafka-topics.sh --list --bootstrap-server localhost:21503 > --command-config /tmp/kafka/config/kraft/client.properties > 00:11:29.415 [main] INFO org.apache.kafka.clients.admin.AdminClientConfig -- > AdminClientConfig values: > auto.include.jmx.reporter = true > bootstrap.controllers = [] > bootstrap.servers = [localhost:21503] > ... > hello-world # Actual topic output > 00:11:29.960 [main] DEBUG org.apache.kafka.clients.admin.KafkaAdminClient -- > [AdminClient clientId=adminclient-1] Initiating close operation. > 00:11:29.960 [main] DEBUG org.apache.kafka.clients.admin.KafkaAdminClient -- > [AdminClient clientId=adminclient-1] Waiting for the I/O thread to exit. Hard > shutdown in 31536000000 ms. > 00:11:29.961 [kafka-admin-client-thread | adminclient-1] INFO > org.apache.kafka.common.utils.AppInfoParser -- App info kafka.admin.client > for adminclient-1 unregistered > 00:11:29.967 [kafka-admin-client-thread | adminclient-1] INFO > org.apache.kafka.common.metrics.Metrics -- Metrics scheduler closed > 00:11:29.967 [kafka-admin-client-thread | adminclient-1] INFO > org.apache.kafka.common.metrics.Metrics -- Closing reporter > org.apache.kafka.common.metrics.JmxReporter > 00:11:29.967 [kafka-admin-client-thread | adminclient-1] INFO > org.apache.kafka.common.metrics.Metrics -- Metrics reporters closed > 00:11:29.967 [kafka-admin-client-thread | adminclient-1] DEBUG > org.apache.kafka.clients.admin.KafkaAdminClient -- [AdminClient > clientId=adminclient-1] Exiting AdminClientRunnable thread. > 00:11:29.968 [main] DEBUG org.apache.kafka.clients.admin.KafkaAdminClient -- > [AdminClient clientId=adminclient-1] Kafka admin client closed. {code} > Running the same command in v3.7.0 gets us: > {code:java} > bash-4.4$ bin/kafka-topics.sh --list --bootstrap-server localhost:21503 > --command-config /tmp/kafka/config/kraft/client.properties > hello-world{code} > I added logging in *kafka-run-class.sh* to make sure the correct log4j > properties file is being selected and sure enough the default pre-packaged > *config/tools-log4j.properties* is selected by this script and the > environment variable *KAFKA_LOG4J_OPTS* is set with this properties file: > {code:java} > # Log4j settings > if [ -z "$KAFKA_LOG4J_OPTS" ]; then > # Log to console. This is a tool. > LOG4J_DIR="$base_dir/config/tools-log4j.properties" > # If Cygwin is detected, LOG4J_DIR is converted to Windows format. > (( WINDOWS_OS_FORMAT )) && LOG4J_DIR=$(cygpath --path --mixed > "${LOG4J_DIR}") > KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:${LOG4J_DIR}" > else > # create logs directory > if [ ! -d "$LOG_DIR" ]; then > mkdir -p "$LOG_DIR" > fi > fi{code} > The *config/tools-log4j.properties* used in both 3.7.0 and 3.7.1 is the same > and contains the following contents(Kafka set defaults): > {code:java} > log4j.rootLogger=WARN, stderr > log4j.appender.stderr=org.apache.log4j.ConsoleAppender > log4j.appender.stderr.layout=org.apache.log4j.PatternLayout > log4j.appender.stderr.layout.ConversionPattern=[%d] %p %m (%c)%n > log4j.appender.stderr.Target=System.err > # for connect-plugin-path > log4j.logger.org.reflections=ERROR{code} > This is a very bizarre bug since nothing changed from our end other than > either upgrading to 3.7.1. We also tried upgrading to 3.8.0 to see if it goes > away but it doesn't. What makes this worse is that the same issue also > happens with Kafka server. Kafka server starting from 3.7.1 only seems to add > logs to console and no longer respects *kafka.logs.dir* system property nor > does it seem to be reading our log4j configuration file that we set like so: > {code:java} > export > KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:${KAFKA_CONFIG_DIRECTORY}/log4j.properties" > {code} > Our log4j properties file for our server looks like so: > {code:java} > log4j.rootLogger=INFO, stdout, kafkaAppender > 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.appender.kafkaAppender=org.apache.log4j.RollingFileAppender > log4j.appender.kafkaAppender.MaxFileSize=1GB > log4j.appender.kafkaAppender.MaxBackupIndex=10 > log4j.appender.kafkaAppender.File=${kafka.logs.dir}/server.log > log4j.appender.kafkaAppender.layout=org.apache.log4j.PatternLayout > log4j.appender.kafkaAppender.layout.ConversionPattern=[%d] %p %m (%c)%n > log4j.appender.stateChangeAppender=org.apache.log4j.RollingFileAppender > log4j.appender.stateChangeAppender.MaxFileSize=1GB > log4j.appender.stateChangeAppender.MaxBackupIndex=10 > log4j.appender.stateChangeAppender.File=${kafka.logs.dir}/state-change.log > log4j.appender.stateChangeAppender.layout=org.apache.log4j.PatternLayout > log4j.appender.stateChangeAppender.layout.ConversionPattern=[%d] %p %m (%c)%n > log4j.appender.requestAppender=org.apache.log4j.RollingFileAppender > log4j.appender.requestAppender.MaxFileSize=1GBlog4j.appender.requestAppender.MaxBackupIndex=10 > log4j.appender.requestAppender.File=${kafka.logs.dir}/kafka-request.log > log4j.appender.requestAppender.layout=org.apache.log4j.PatternLayout > log4j.appender.requestAppender.layout.ConversionPattern=[%d] %p %m (%c)%n > log4j.appender.cleanerAppender=org.apache.log4j.RollingFileAppender > log4j.appender.cleanerAppender.MaxFileSize=1GB > log4j.appender.cleanerAppender.MaxBackupIndex=10 > log4j.appender.cleanerAppender.File=${kafka.logs.dir}/log-cleaner.log > log4j.appender.cleanerAppender.layout=org.apache.log4j.PatternLayout > log4j.appender.cleanerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n > log4j.appender.controllerAppender=org.apache.log4j.RollingFileAppender > log4j.appender.controllerAppender.MaxFileSize=1GB > log4j.appender.controllerAppender.MaxBackupIndex=10log4j.appender.controllerAppender.File=${kafka.logs.dir}/controller.log > log4j.appender.controllerAppender.layout=org.apache.log4j.PatternLayoutlog4j.appender.controllerAppender.layout.ConversionPattern=[%d] > %p %m (%c)%n > log4j.appender.authorizerAppender=org.apache.log4j.RollingFileAppender > log4j.appender.authorizerAppender.MaxFileSize=1GB > log4j.appender.authorizerAppender.MaxBackupIndex=10 > log4j.appender.authorizerAppender.File=${kafka.logs.dir}/kafka-authorizer.loglog4j.appender.authorizerAppender.layout=org.apache.log4j.PatternLayout > log4j.appender.authorizerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n > # Change the line below to adjust ZK client > logginglog4j.logger.org.apache.zookeeper=INFO > # Change the two lines below to adjust the general broker logging level > (output to server.log and > stdout)log4j.logger.kafka=INFOlog4j.logger.org.apache.kafka=INFO > # Change to DEBUG or TRACE to enable request logging > log4j.logger.kafka.request.logger=OFF, requestAppender > log4j.additivity.kafka.request.logger=false > # Uncomment the lines below and change > log4j.logger.kafka.network.RequestChannel$ to TRACE for additional output > # related to the handling of > requests#log4j.logger.kafka.network.Processor=TRACE, requestAppender > #log4j.logger.kafka.server.KafkaApis=TRACE, requestAppender > #log4j.additivity.kafka.server.KafkaApis=false > log4j.logger.kafka.network.RequestChannel$=WARN, requestAppender > log4j.additivity.kafka.network.RequestChannel$=false > # Change the line below to adjust KRaft mode controller > logginglog4j.logger.org.apache.kafka.controller=INFO, controllerAppender > log4j.additivity.org.apache.kafka.controller=false > # Change the line below to adjust ZK mode controller logging > log4j.logger.kafka.controller=TRACE, controllerAppender > log4j.additivity.kafka.controller=false > log4j.logger.kafka.log.LogCleaner=INFO, cleanerAppender > log4j.additivity.kafka.log.LogCleaner=false > log4j.logger.state.change.logger=TRACE, stateChangeAppender > log4j.additivity.state.change.logger=false > # Access denials are logged at INFO level, change to DEBUG to also log > allowed accesses > log4j.logger.kafka.authorizer.logger=INFO, authorizerAppender > log4j.additivity.kafka.authorizer.logger=false {code} > And here's how we initialize the appropriate log4j environment variables in > our Kafka startup script: > {code:java} > export KAFKA_CONFIG_DIRECTORY="/tmp/kafka/kraft/config" > export > KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:${KAFKA_CONFIG_DIRECTORY}/log4j.properties" > export LOG_DIR="/logs/kafka/" > ... > bin/kafka-server-start.sh > ${KAFKA_CONFIG_DIRECTORY}/kraft/broker.properties{code} > Again nothing changed here. It's the same code we have used since v3.5.0. Any > ideas what's going wrong? Did 3.7.1 upgrade introduce any regressions or > changes to Kafka logging? > Here's an example of what the Kafka broker logs(emitted to console) look like > after upgrading to 3.7.1+ > {code:java} > 2024-08-04_00:35:13.89138 00:35:13.891 [kafka-2-raft-io-thread] DEBUG > org.apache.kafka.raft.KafkaRaftClient -- [RaftManager id=2] Follower high > watermark updated to 455399 > 2024-08-04_00:35:13.89159 00:35:13.891 [kafka-2-raft-io-thread] DEBUG > org.apache.kafka.raft.KafkaRaftClient -- [RaftManager id=2] Notifying > listener org.apache.kafka.image.loader.MetadataLoader@670337647 of batch for > baseOffset 455398 and lastOffset OptionalLong.empty > 2024-08-04_00:35:13.89169 00:35:13.891 [kafka-2-raft-outbound-request-thread] > DEBUG org.apache.kafka.clients.NetworkClient -- [RaftManager id=2] Sending > FETCH request with header RequestHeader(apiKey=FETCH, apiVersion=16, > clientId=raft-client-2, correlationId=4602, headerVersion=2) and timeout 2000 > to node 3: FetchRequestData(clusterId='_EMgkMHpTcKhrGEMNo01zA', replicaId=-1, > replicaState=ReplicaState(replicaId=2, replicaEpoch=-1), maxWaitMs=500, > minBytes=0, maxBytes=8388608, isolationLevel=0, sessionId=0, sessionEpoch=-1, > topics=[FetchTopic(topic='__cluster_metadata', > topicId=AAAAAAAAAAAAAAAAAAAAAQ, partitions=[FetchPartition(partition=0, > currentLeaderEpoch=82, fetchOffset=455400, lastFetchedEpoch=82, > logStartOffset=-1, partitionMaxBytes=0)])], forgottenTopicsData=[], rackId='') > 2024-08-04_00:35:13.89177 00:35:13.891 > [kafka-2-metadata-loader-event-handler] DEBUG > org.apache.kafka.image.loader.MetadataBatchLoader -- [MetadataLoader id=2] > handleCommit: Generated a metadata delta between 455397 and 455398 from 1 > batch(es) in 0 us. > 2024-08-04_00:35:13.89182 00:35:13.891 > [kafka-2-metadata-loader-event-handler] DEBUG > org.apache.kafka.image.loader.MetadataLoader -- [MetadataLoader id=2] > handleCommit: publishing new image with provenance > MetadataProvenance(lastContainedOffset=455398, lastContainedEpoch=82, > lastContainedLogTimeMs=1722731713365).{code} > P.S Our Kafka jars are directly downloaded from > [https://kafka.apache.org/downloads] with no modifications to the binaries -- This message was sent by Atlassian Jira (v8.20.10#820010)