我编写了在hadoop(2.1或2.2)上运行的类作为hive UDF / UDTF查询的一部分。最终它作为Map / Reduce工作运行。 应用程序执行各种任务,我想根据日志级别添加日志记录。
我想知道这样做的最佳方式(或正确方法)。 显然,我不希望日志驻留在未收集的数据节点上的某个文件中。我希望hadoop收集日志,以便我们能够从作业跟踪器等中心位置查看所有日志。
选项-1:直接日志记录解决方案 - 打印到system.out / system.err 我看到很多论坛提到打印到系统或系统错误,但它将意味着开发我们自己的具有调试级别等的日志记录机制......
System.out.println("my log message");
选项-2:使用hadoop的log4j commons日志记录 其他帖子提到使用apache commons logging。
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
private static final Log LOG = LogFactory.getLog(MgrsIndexCommon.class);
LOG.trace(“my logging message”);
我使用它,它可以工作,但我没有权限修改记录器配置文件。 我正在考虑添加一个功能,在我的应用程序配置文件中包含日志级别,并从java代码修改日志级别。 顺便说一句,我没有在我的pom.xml中为log4j添加依赖项,而是使用了hadoop库附带的依赖项。
如果有人使用此选项,那么您是如何配置记录器的?
选项-3: log4j 2 一些架构师提到我们应该考虑添加log4j 2依赖项,并使用它。这个领域有什么建议吗?如果hadoop正在使用log4j,我可以自带log4j 2并使用它来写入hadoops日志吗?
在我继续之前,我想看看是否有人有好的建议。
感谢。
答案 0 :(得分:1)
我更喜欢Logger log = Logger.getLogger(MyClass.class.getName());
,它会收集作业跟踪器中的日志。
对于调试java map reduce文件,您可以为每个类(驱动程序,映射器,reducer)使用记录器。
log.info( "varOne: " + varOne );
要检查变量,只需使用:
<Credits>
<Director>Movie</Director>
<Director>Movie</Director>
<Director>Movie</Director>
<Producer></Producer>
<Producer></Producer>
<Actor>Jules Verne</Actor>
<Producer></Producer>
<Actor>Jules Verne</Actor>
<Actor>Jules Verne</Actor>
</Credits>
这些日志行可以打印在您工作的管理页面中。
答案 1 :(得分:1)
我曾经使用过slf4j,它是log4j和其他日志库的包装器,如果你需要更改到其他一些日志库,你可以在不改变实际代码的情况下使用。
import org.slf4j.LoggerFactory;
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(WordCountExampleLoggingTest.class);
//将其用作
LOG.error("Inseide Mapper");
LOG.info("inside reducer ");
//对于日志记录配置,请在应用程序的resources文件夹中添加log4j.properies文件。
ODS.LOG.DIR=/var/log/appLogs
ODS.LOG.INFO.FILE=application.log
ODS.LOG.ERROR.FILE=application_error.log
# Root logger option
log4j.rootLogger=ERROR, console
log4j.logger.com.ournamespace=ERROR, APP_APPENDER, ERROR_APPENDER
#
# console
# Add "console" to rootlogger above if you want to use this
#
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}-%r %p %c{5}: %m%n
# Direct log messages to a log file
log4j.appender.APP_APPENDER=org.apache.log4j.RollingFileAppender
log4j.appender.APP_APPENDER.File=${ODS.LOG.DIR}/${ODS.LOG.INFO.FILE}
log4j.appender.APP_APPENDER.MaxFileSize=200MB
log4j.appender.APP_APPENDER.MaxBackupIndex=30
log4j.appender.APP_APPENDER.layout=org.apache.log4j.PatternLayout
log4j.appender.APP_APPENDER.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}-%r %p %c{10}: %m%n
log4j.appender.ERROR_APPENDER=org.apache.log4j.RollingFileAppender
log4j.appender.ERROR_APPENDER.Threshold=ERROR
log4j.appender.ERROR_APPENDER.File=${ODS.LOG.DIR}/${ODS.LOG.ERROR.FILE}
log4j.appender.ERROR_APPENDER.MaxFileSize=200MB
log4j.appender.ERROR_APPENDER.MaxBackupIndex=90
log4j.appender.ERROR_APPENDER.layout=org.apache.log4j.PatternLayout
log4j.appender.ERROR_APPENDER.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}-%r %p %c{10}: %m%n
我可以查看来自ambari job tracker UI的日志。 我希望能帮到你。