覆盖hadoop中的log4j.properties

时间:2012-01-31 14:54:07

标签: hadoop log4j

如何覆盖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

9 个答案:

答案 0 :(得分:8)

如果使用默认的Log4j.properties文件,日志记录设置将被启动脚本中的环境变量覆盖。如果您想使用默认的log4j,只想更改日志记录级别,请使用$HADOOP_CONF_DIR/hadoop-env.sh

例如,要将记录器更改为DEBUG日志级别和DRFA记录器,请使用

export HADOOP_ROOT_LOGGER="DEBUG,DRFA"

答案 1 :(得分:6)

  1. 您可以从log4j.properties
  2. 中删除hadoop jar
  3. 或确保您的jar / log4j.properties在类路径中排在第一位(log4j从它找到的类路径中选择第一个log4j.properties
  4. 或指定系统变量:{​​{1}}
  5. 请参阅documentation以了解log4j如何找到配置。

答案 2 :(得分:6)

修改log4j内的HADOOP_CONF_DIR文件。请注意,hadoop作业不会考虑应用程序的log4j文件。它将考虑HADOOP_CONF_DIR内的那个。

如果您想强制hadoop使用其他log4j文件,请尝试以下方法之一:

  1. 你可以试试@Patrice所说的。即。

    -Dlog4j.configuration =文件:/path/to/user_specific/log4j.xml

  2. 自定义HADOOP_CONF_DIR / log4j.xml并根据您的意愿设置“您的”类的记录器级别。其他用户不会因此而受到影响,除非两者都具有相同包结构的类。这不适用于核心hadoop类,因为所有用户都会被捕获。

  3. 创建自定义的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