问题导读
1.自定义修改hadoop/conf/log4j.properties,需要添加哪些内容?
2.需要修改那个类?
3.修改后,如何生效?
log4j.propertites
复制代码
hadoop日志级别设置在hadoop/bin/ hadoop-daemon.sh文件下 export HADOOP_ROOT_LOGGER="DEBUG,DRFA"
自定义日志目标:将需要的信息写入自己指定的独立的日志中。
需求:这次只是一个尝试,在DFSClient中,将部分内容写入指定的日志文件中。在客户端读取HDFS数据时,将读的blockID写入文件。
步骤:
1、修改hadoop/conf/log4j.properties文件。在文件末尾添加如下内容:
#为写日志的操作取个名字,MyDFSClient。用来在DFSClient中获取该日志的实例。并指定输出方式为自定义的OUT
log4j.logger.MyDFSClient=DEBUG,OUT
#设置OUT的输出方式为输出到文件
log4j.appender.OUT=org.apache.log4j.FileAppender
#设置文件路径
log4j.appender.OUT.File=${hadoop.log.dir}/DFSClient.log
#设置文件的布局
log4j.appender.OUT.layout=org.apache.log4j.PatternLayout
#设置文件的格式
log4j.appender.OUT.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
#设置该日志操作不与父类日志操作重叠
log4j.additivity.MyDFSClient=false
2、保存该文件,复制到集群各个节点的hadoop/conf目录下,替换原有的文件。
3、修改DFSClient类
这里只是简单的为了验证这个过程的正确性,以后还回加入更有意义的日志内容。
首先在DFSClient类中声明一个LOG实例:
public static final Log myLOG = LogFactory.getLog("MyDFSClient");
在read(byte buf[], int off, int len)函数中,添加如下代码:
myLOG.info("Read Block!!!!");
if(currentBlock!=null)
myLOG.info("Read block: "+currentBlock.getBlockId());
4、重新启动hadoop。
5、这里使用dfs命令进行测试。
$bin/hadoop dfs -cat /user/XXX/out/part-r-00000
可以看到文件part-r-00000的内容输出到屏幕。这时在/hadoop/logs/DFSClient.log文件中,可以看到刚才在类中记录的日志。验证成功。
|