背景:kafka的服务日志输出要求不能放在系统盘(空间比较小) 

操作:本能的修改log4j.properties的日志输出,如图:

结果重启服务后发现未生效,日志还是输出到当前目录的logs中
猜测:设置的变量kafka.logs.dir未生效,那这个变量哪里来的呢?看下启动脚本

验证
1、查看kafka启动脚本 kafka-server-start.sh, 其实真正的启动类是:

if [ "x$KAFKA_LOG4J_OPTS" = "x" ]; then

    export KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:$base_dir/../config/log4j.properties"

fi


exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"

2、继续查看kafka-run-class.sh,简要代码摘录如下:

base_dir=$(dirname $0)/..

# Log directory to use

if [ "x$LOG_DIR" = "x" ]; then

  LOG_DIR="$base_dir/logs" #这里才是问题真正的原因

fi

 

# 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.

  (( CYGWIN )) && 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

KAFKA_LOG4J_OPTS="-Dkafka.logs.dir=$LOG_DIR $KAFKA_LOG4J_OPTS"

 

3、到这里就能解释了kafka.logs.dir为什么设置未生效的问题
 

解决办法:在kafka-run-class.sh的头部添加   LOG_DIR=/data/kafka_logs 即可。

 

其他补充:需要提前创建好目录并赋权
for i in `cat kafka`;do ssh -p2208  $i "sudo mkdir -p /data/kafka_logs;sudo chown -R master:master /data/kafka_logs" ;done;

 

总结:源码面前没有秘密,需学会溯源,从现象到本质。

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐