修改Kafka服务日志输出目录不生效排查过程
背景:kafka的服务日志输出要求不能放在系统盘(空间比较小)操作:本能的修改log4j.properties的日志输出,如图:结果:重启服务后发现未生效,日志还是输出到当前目录的logs中猜测:设置的变量kafka.logs.dir未生效,那这个变量哪里来的呢?看下启动脚本验证:1、查看kafka启动脚本 kafka-server-start.sh, 其实真正的启动类是:if...
背景: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;
总结:源码面前没有秘密,需学会溯源,从现象到本质。
更多推荐
所有评论(0)