我想使用log4j在Hive UDF的文件中编写日志消息。
我编写了一个简单的UDF,它按照预期工作,并能够在本地文件中写入日志消息。
但是当我试图在Hadoop集群上测试hive shell中的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
任何人都可以帮助我为什么上面配置的代码不是在指定路径上的文件中写日志消息?
先谢谢!!
答案 0 :(得分:0)
您应该考虑将udf jar文件复制到集群上并由每个节点执行,因此如果路径有效且用户有权写入,则会在每台计算机中写入日志文件。
答案 1 :(得分:0)
这就是我最后提出上述问题的方法。
我的属性文件中的一些更改如下所示:
log4j.rootLogger= FATAL,file
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=/idn/home/sshivhar/Sanjeev_POC/log/application_new
log4j.appender.file.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
我将日志记录级别更改为FATAL ,因为我只查找我在UDF中编写的那些消息。
因为记录消息的优先级低于优先级:
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
如果我将 FATAL
更改为INFO
,它还会将不需要的WARN
和ERROR
条消息写入来自的文件中hive shell就像mapper,reducer信息一样。同样,DEBUG
会写出DEBUG
,INFO
,WARN
,ERROR
,FATAL
条消息。
将HIVE UDF中的log.debug
更改为log.fatal
。其余代码与上述相同。
使用hiveconf参数将属性文件传递给hive shell,输入如下:
hive -hiveconf hive.log4j.file=/path/log4jprop.properties
以下命令:
ADD JAR path
CREATE TEMPORARY FUNCTION udfName as 'class_path'
select udfName(col) from table;
日志文件将每天创建,并可根据需要进行自定义。