要想很好的监控Hadoop集群的状态,hadoop打印的log是很重要的。我们的思路是使用部门研发的log appender将hadoop的数据append到我们自己的central logging数据库中(其实就是存在hbase中)。
说起来简单,实际操作起来也花了一天多的时间,下面记录下整个过程。
首先要明确hadoop使用的log机制。hadoop使用了slf4j,log4j,apache的common-logging。slf4j是纯的log接口,common-logging和log4j既是接口也有实现。而common-logging在检查到classpath下有log4j存在时会默认用log4j吐出log,classpath里有slf4j-log4j12-xxx.jar时slf4j也通过log4j吐出log。这样hadoop的所有log都通过一个log4j.properties配置即可管理log的吐出。关系图如下:
但。。。我们自己的central logging系统只有logback的appender。因此需要把这些logging的家伙都转到logback里再通过logback里的logAppender存到我们自己的log系统里。
了解了原理,我们看下如何让logback一统天下,把他们全收拾了。
原理:
在classpath中加上log4j-over-slf4j jar包,这样log4j就会进入slf4j,在classpath中加入jcl-over-slf4j jar包,common-logging的log就也会进入slf4j。此时只要再加上logback的jar包,slf4j是纯接口,此时只有logback一条路可以走,这样所有的log就会乖乖的都从logback里吐出来了。下面看下实际配置的步骤:
1.创建需要lib的文件夹:
sudo mkdir /logback
2.放入我们所需的lib:
3.由于我们用的cdh系列,需要让lib目录能够让hdfs用户能访问:
sudo chmod 777 -R /logback
sudo chown -R hdfs:hdfs /logback
4.修改hadoop的启动脚本,添加我们的lib到classpath下:
sudo vim /etc/hadoop/conf/hadoop-env.sh
添加以下内容
<SPAN>修改classpath
LOGBACK_HOME=/logback
for i in "$LOGBACK_HOME"/*.jar; do
HADOOP_CLASSPATH="$i":"$HADOOP_CLASSPATH"
done
export HADOOP_CLASSPATH</SPAN>