flume的log4j日志无输出排查
1. 背景
用作采集日志的flume程序,突然发现没有有效的日志输出,改$FLUME_HOME/conf/log4j.properties下面的配置,在命令行里面加日志级别的控制参数,都没有日志输出。
2. 解决过程记录
2.1 步骤1
在进程的启动参数里面加上如下参数:
-Dlog4j.debug=true
在日志输出内容中,找以下内容:
log4j: Trying to find [log4j.properties] using context classloader...
log4j: Using URL [log4j的文件路径] for configuration.
最后发现输出:
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@65b54208.
log4j: Using URL [file:/xxxx/hadoop/etc/hadoop/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL file:/xxxx/hadoop/etc/hadoop/log4j.properties
即它的log4j日志文件路径引用错误,引入了hadoop的日志配置文件。
2.2 步骤2
它为什么会引入Hadoop下面的log4j.properties
用ps -ef|grep 查看进程的实际启动命令会发现它其中有这么一段:
-cp 'conf:/xcloud/flume-1.9.0/lib/*:/xcloud/hadoop/etc/hadoop:...
-cp命令是指定class-path,log4j.properties就放在conf目录下,可这里运行flume的路径位置是FLUME_HOME/bin目录下,显然这样指定相对目录,它会是指定到$FLUME_HOME/bin/conf,显然是不对的。
查看flume_ng脚本,也会发现能正确定位conf的目录配置时,它会把启动时-c或-conf指定的路径转化为绝对路径,加入到-cp中,显然这里因为没有找到conf相对路径,而没有改成绝对位置。
2.3 步骤3
解决方法
方法1:这里-c命令之后用绝对路径引入conf,避免程序启动位置对它造成影响
