在Hadoop中覆盖log4j.properties文件

17

如何覆盖hadoop中的默认log4j.properties?如果我设置hadoop.root.logger=WARN,console,则不会在控制台上打印日志,但我想要的是它不应该在日志文件中打印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

请提供hadoop中完整的log4j.properties文件。您需要更改的是filelogger而不是根logger。 - oers
这是log4j.properties文件。 - Praveen Sripati
我不想更改默认文件,因为我只想为一个用户自定义日志。那么,我该如何做呢? - RFT
log4j.properties 添加在哪个 jar 包中?将其保留在类路径中应该足以满足客户端和节点的需求。 - Praveen Sripati
1
我将它与我的MapReduce代码一起打包了。我该如何告诉Hadoop从我的jar文件中使用它而不是默认的文件? - RFT
9个回答

8
如果您使用默认的Log4j.properties文件,则日志记录设置将被启动脚本中的环境变量覆盖。如果您想使用默认的log4j,并只想更改日志记录级别,请使用$HADOOP_CONF_DIR/hadoop-env.sh
例如,要将记录器更改为DEBUG日志级别和DRFA记录器,请使用:
export HADOOP_ROOT_LOGGER="DEBUG,DRFA"

8

修改HADOOP_CONF_DIR内的log4j文件。注意,Hadoop作业不会考虑您的应用程序的log4j文件,它将考虑HADOOP_CONF_DIR中的log4j文件。

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

  1. 您可以尝试像@Patrice所说的那样,即:

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

  2. 自定义HADOOP_CONF_DIR/log4j.xml并根据您的意愿设置“您”的类的日志记录器级别。其他用户不会受到影响,除非两者具有相同的包结构中的类。对于核心Hadoop类,此方法无效,因为所有用户都会受到影响。

  3. 创建您的定制log4j文件。复制目录HADOOP_CONF_DIR并将您的log4j文件放入其中。将HADOOP_CONF_DIR导出到您的conf目录。其他用户将指向默认目录。


6
  1. 您可以从hadoop jar中删除log4j.properties
  2. 或确保您的jar/log4j.properties在类路径中位于首位(log4j从类路径中找到的第一个log4j.properties)
  3. 或指定系统变量:-Dlog4j.configuration=PATH_TO_FILE

请参阅文档以了解log4j如何找到配置。


我尝试通过指定系统变量来解决问题。我更改了以下两个语句: **hadoop.root.logger=WARN,console hadoop.security.logger=WARN,console** 所以,它不应该在控制台上打印信息,但它仍然会打印。我无法找出在文件记录器中进行哪些更改。此外,我应该如何设置类路径中的log4j.properties? - RFT
另外,我不希望效果是普遍的。它应该仅限于单个用户。因此,如果我将其打包在我的jar文件中,那会更好。有没有解决方法? - RFT
@sid 发布log4j.properties文件(编辑您的问题),我不知道有任何仅限于单个用户的记录器。 - oers
这是log4j文件[http://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.22/common/conf/log4j.properties]。 - RFT
我将log4j文件打包到jar中,并使用**-Dmapreduce.job.user.classpath.first=true**将其设置在类路径中。但我没有看到任何区别。 - RFT
@sid 抱歉,Hadoop 不是我的专长,我的回答只涉及 log4j,但根据其规则,在 Hadoop 中应该也可以使用。 - oers

4
我曾经遇到了同样的问题(CDH3U3,Hadoop 0.20.2)。最终,我找到了一种解决方案(注意路径中的file:前缀):
-Dlog4j.configuration=file:/path/to/user_specific/log4j.xml

3

Maven打包:

当我意识到需要将自定义的debug-log.properties文件添加到src/main/java/resources中时,Maven会将其添加到应用程序.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> Action:

 <property>
      <name>mapred.child.java.opts</name>
      <value>-Dlog4j.configuration=${log4jConfig}</value>
 </property> 

2

正如Sulpha所提到的,对于hadoop 1.2.1版本,重写位于hadoop-core.jar内部的task-log4j.properties文件非常重要。

在我的伪分布式模式下,我无法打印出pig 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 

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'

0
在Hadoop 1.2.1中有两个配置文件:log4j.properties和task-log4j.properties。因此,要使上述示例工作,必须在task-log4j.properties而不是log4j.properties中进行更改。

you can add follwing line in your task-log4j.properties:

log4j.logger.org.xxx=WARN


0
如果在jar文件中已经配置了log4j属性文件,您可以通过在-classpath之前简单地放置-Dlog4j.configuration=来覆盖它。
以下是示例:
java -Dlog4j.configuration=..\conf\log4j.properties -classpath %CLASSPATH%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接