如何覆盖hadoop中的默认log4j.properties?如果我设置hadoop.root.logger = WARN,控制台,它不会在控制台上打印日志,而我想要的是它不应该在日志文件中打印INFO。我在jar中添加了一个log4j.properties文件,但是我无法覆盖默认文件。简而言之,我希望日志文件只打印错误和警告。
# Define some default values that can be overridden by system properties
hadoop.root.logger=INFO,console
hadoop.log.dir=.
hadoop.log.file=hadoop.log
#
# Job Summary Appender
#
# Use following logger to send summary to separate file defined by
# hadoop.mapreduce.jobsummary.log.file rolled daily:
# hadoop.mapreduce.jobsummary.logger=INFO,JSA
#
hadoop.mapreduce.jobsummary.logger=${hadoop.root.logger}
hadoop.mapreduce.jobsummary.log.file=hadoop-mapreduce.jobsummary.log
# Define the root logger to the system property "hadoop.root.logger".
log4j.rootLogger=${hadoop.root.logger}, EventCounter
# Logging Threshold
log4j.threshold=ALL
#
# Daily Rolling File Appender
#
log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file}
# Rollver at midnight
log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
# 30-day backup
#log4j.appender.DRFA.MaxBackupIndex=30
log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout
# Pattern format: Date LogLevel LoggerName LogMessage
log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
# Debugging Pattern format
#log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n
#
# console
# Add "console" to rootlogger above if you want to use this
#
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
#
# TaskLog Appender
#
#Default values
hadoop.tasklog.taskid=null
hadoop.tasklog.iscleanup=false
hadoop.tasklog.noKeepSplits=4
hadoop.tasklog.totalLogFileSize=100
hadoop.tasklog.purgeLogSplits=true
hadoop.tasklog.logsRetainHours=12
log4j.appender.TLA=org.apache.hadoop.mapred.TaskLogAppender
log4j.appender.TLA.taskId=${hadoop.tasklog.taskid}
log4j.appender.TLA.isCleanup=${hadoop.tasklog.iscleanup}
log4j.appender.TLA.totalLogFileSize=${hadoop.tasklog.totalLogFileSize}
log4j.appender.TLA.layout=org.apache.log4j.PatternLayout
log4j.appender.TLA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
#
#Security appender
#
hadoop.security.log.file=SecurityAuth.audit
log4j.appender.DRFAS=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRFAS.File=${hadoop.log.dir}/${hadoop.security.log.file}
log4j.appender.DRFAS.layout=org.apache.log4j.PatternLayout
log4j.appender.DRFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
#new logger
# Define some default values that can be overridden by system properties
hadoop.security.logger=INFO,console
log4j.category.SecurityLogger=${hadoop.security.logger}
#
# Rolling File Appender
#
#log4j.appender.RFA=org.apache.log4j.RollingFileAppender
#log4j.appender.RFA.File=${hadoop.log.dir}/${hadoop.log.file}
# Logfile size and and 30-day backups
#log4j.appender.RFA.MaxFileSize=1MB
#log4j.appender.RFA.MaxBackupIndex=30
#log4j.appender.RFA.layout=org.apache.log4j.PatternLayout
#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} - %m%n
#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n
#
# FSNamesystem Audit logging
# All audit events are logged at INFO level
#
log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=WARN
# Custom Logging levels
#log4j.logger.org.apache.hadoop.mapred.JobTracker=DEBUG
#log4j.logger.org.apache.hadoop.mapred.TaskTracker=DEBUG
#log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=DEBUG
# Jets3t library
log4j.logger.org.jets3t.service.impl.rest.httpclient.RestS3Service=ERROR
#
# Event Counter Appender
# Sends counts of logging messages at different severity levels to Hadoop Metrics.
#
log4j.appender.EventCounter=org.apache.hadoop.metrics.jvm.EventCounter
#
# Job Summary Appender
#
log4j.appender.JSA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.JSA.File=${hadoop.log.dir}/${hadoop.mapreduce.jobsummary.log.file}
log4j.appender.JSA.layout=org.apache.log4j.PatternLayout
log4j.appender.JSA.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
log4j.appender.JSA.DatePattern=.yyyy-MM-dd
log4j.logger.org.apache.hadoop.mapred.JobInProgress$JobSummary=${hadoop.mapreduce.jobsummary.logger}
log4j.additivity.org.apache.hadoop.mapred.JobInProgress$JobSummary=false
#
# MapReduce Audit Log Appender
#
# Set the MapReduce audit log filename
#hadoop.mapreduce.audit.log.file=hadoop-mapreduce.audit.log
# Appender for AuditLogger.
# Requires the following system properties to be set
# - hadoop.log.dir (Hadoop Log directory)
# - hadoop.mapreduce.audit.log.file (MapReduce audit log filename)
#log4j.logger.org.apache.hadoop.mapred.AuditLogger=INFO,MRAUDIT
#log4j.additivity.org.apache.hadoop.mapred.AuditLogger=false
#log4j.appender.MRAUDIT=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.MRAUDIT.File=${hadoop.log.dir}/${hadoop.mapreduce.audit.log.file}
#log4j.appender.MRAUDIT.DatePattern=.yyyy-MM-dd
#log4j.appender.MRAUDIT.layout=org.apache.log4j.PatternLayout
#log4j.appender.MRAUDIT.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
答案 0 :(得分:8)
如果使用默认的Log4j.properties文件,日志记录设置将被启动脚本中的环境变量覆盖。如果您想使用默认的log4j,只想更改日志记录级别,请使用$HADOOP_CONF_DIR/hadoop-env.sh
例如,要将记录器更改为DEBUG日志级别和DRFA记录器,请使用
export HADOOP_ROOT_LOGGER="DEBUG,DRFA"
答案 1 :(得分:6)
log4j.properties
hadoop jar
jar
/ log4j.properties
在类路径中排在第一位(log4j从它找到的类路径中选择第一个log4j.properties
)请参阅documentation以了解log4j如何找到配置。
答案 2 :(得分:6)
修改log4j
内的HADOOP_CONF_DIR
文件。请注意,hadoop作业不会考虑应用程序的log4j文件。它将考虑HADOOP_CONF_DIR
内的那个。
如果您想强制hadoop使用其他log4j
文件,请尝试以下方法之一:
你可以试试@Patrice所说的。即。
-Dlog4j.configuration =文件:/path/to/user_specific/log4j.xml
自定义HADOOP_CONF_DIR / log4j.xml并根据您的意愿设置“您的”类的记录器级别。其他用户不会因此而受到影响,除非两者都具有相同包结构的类。这不适用于核心hadoop类,因为所有用户都会被捕获。
创建自定义的log4j文件。复制目录HADOOP_CONF_DIR并将log4j文件放入其中。将HADOOP_CONF_DIR导出到您的conf目录。其他用户将指向默认用户。
答案 3 :(得分:3)
我遇到了同样的问题(CDH3U3,Hadoop 0.20.2)。我终于找到了一个解决方案(路径中注明file:
前缀):
-Dlog4j.configuration=file:/path/to/user_specific/log4j.xml
答案 4 :(得分:3)
Maven包装:
一旦我意识到我需要将自定义debug-log.properties
文件添加到src / main / java / resources,Maven就将其添加到application.jar根目录中,然后只是引用或不引用它在命令行的-Dlog4j.configuration=debug-log.properties
中。
Oozie <java>
行动:
关于Oozie,请在workflow.xml操作中使用<java-opts>-Dlog4j.configuration=${log4jConfig}</java-opts>
,并在job.properties文件中定义以下内容。
#one of the following log4j.config parameters must be defined
#log4jConfig=log4j.properties
log4jConfig=debug-log.properties
Oozie <map-reduce>
行动:
<property>
<name>mapred.child.java.opts</name>
<value>-Dlog4j.configuration=${log4jConfig}</value>
</property>
答案 5 :(得分:2)
如Sulpha所述, 对于hadoop 1.2.1,重要的是覆盖hadoop-core.jar中存在的task-log4j.properties
对于我的伪分布式模式,
我无法打印我的猪UDF的调试消息,不得不从hadoop-core.jar中删除task-log4j.properties,并将其替换为$ HADOOP_INSTALL / conf / log4j.properties的副本。
使用
zip -d hadoop-core-1.2.1.jar task-log4j.properties #to delete
和
zip -g hadoop-core-1.2.1.jar task-log4j.properties #to add back
答案 6 :(得分:0)
如果jar文件中已经配置了log4j属性文件。您可以通过在-classpath
之前简单地放置-Dlog4j.configuration =来覆盖这是样本:
java -Dlog4j.configuration = .. \ conf \ log4j.properties -classpath%CLASSPATH%
答案 7 :(得分:0)
将log4j.configuration选项放在子java选项中。
即
hadoop jar ... -Dmapred.child.java.opts=-Dlog4j.configuration=file:/...../log4j_debug.properties
您必须将log4j_debug.properties文件放在同一目录路径中的所有从属服务器上,例如/home/yourname/log4j_debug.properties或/tmp/log4j_debug.properties
此设置将覆盖mapred.child.java.opts设置。 如果你想使用其他选项,如-Xmx32m,这意味着32MB堆大小,那么请执行以下操作:
hadoop jar ... -Dmapred.child.java.opts='-Xmx32m -Dlog4j.configuration=file:/...../log4j_debug.properties'
答案 8 :(得分:0)
在Hadoop 1.2.1中有2个配置文件:log4j.properties和 task-log4j.properties 因此,为了使上面的示例工作,必须在task-log4j.properties中完成更改,而不是在log4j.properties
中您可以在task-log4j.properties中添加以下行:
log4j.logger.org.xxx=WARN