我想使用log4j在hiveudf的文件中写入日志消息。
我已经编写了一个简单的自定义项,它是按照预期的工作,并能够写日志消息在本地文件。
但是当我在hadoop集群上测试hiveshell中的udf时,它无法在文件中写入日志消息。
代码如下:
package com.log4j.example;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.log4j.Logger;
public class isNull extends UDF {
private final static Logger log = Logger.getLogger(isNull.class.getName());
public Boolean evaluate(String input) {
Object in = input;
boolean returnType = false;
if (in == null) {
log.debug("Input is Null"+in);
returnType = true;
} else {
returnType = false;
}
return returnType;
}}
Below is the properties file for log4j
# TRACE < DEBUG < INFO < WARN < ERROR < FATAL
log4j.rootLogger = DEBUG, toConsole, toFile
# CONSOLE
log4j.appender.toConsole=org.apache.log4j.ConsoleAppender
log4j.appender.toConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.toConsole.layout.ConversionPattern=%d{HH:mm:ss} %5p [%t] - %c.%M - %m%n
# DAILYROLLINGFILE
log4j.appender.toFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.toFile.File=/idn/home/test/logfile.log
# log4j.appender.toFile.Append=false
log4j.appender.toFile.DatePattern='.'yyyy`enter code here`-MM-dd
log4j.appender.toFile.layout=org.apache.log4j.PatternLayout
log4j.appender.toFile.layout.ConversionPattern=%d %5p [%t] - %c.%M - %m%n
有人能告诉我为什么上面配置的代码没有在指定路径上的文件中写入日志消息吗?
提前谢谢!!
2条答案
按热度按时间7gs2gvoe1#
您应该考虑udfjar文件是在集群上复制的,并且由每个节点执行,因此如果路径有效并且用户有写入权限,那么在每台机器上都会写入一个日志文件。
nuypyhwy2#
我就是这样回答上面的问题的。
在我的属性文件中做了如下更改:
我将日志级别改为fatal,因为我只查找那些我在udf中编写的消息。
因为日志消息的优先级低于:
如果我改变主意
FATAL
至INFO
,它还将写入不需要的WARN
以及ERROR
将来自hiveshell的消息放入文件中,如mapper、reducer信息。同样地,DEBUG
将写入DEBUG
,INFO
,WARN
,ERROR
,FATAL
信息。更改了
log.debug
至log.fatal
在Hive里。其余代码与上面的相同。使用hiveconf参数将属性文件传递给配置单元外壳,同时输入如下所示:
运行以下命令:
日志文件将每天创建,并可根据需要自定义。