如何在使用hadoop时使用logger api编写java日志文件

Gab*_*l H 5 java logging hadoop

我写了一个地图减少我想要调试的代码.

为了做到这一点,我不能使用标准输出,因为除非发生错误,否则Hadoop平台不会将其打印到屏幕上.

相反,我试图使用记录器,以创建日志文件.

我使用处理程序将它拆分为两个文件,遗憾的是,"严重"的日志文件是空的,而一般日志文件只记录主线程中发生的事情而不是映射减少函数.

问题如下:

有没有hadoop和日志文件的问题,还是我的记录器配置有问题?如果是这样,如何纠正它.

日志配置代码:我使用一个记录器来处理整个应用程序(这次是root logger)

public static Logger configureLogging() 
    {
        try
        {
            logger=Logger.getLogger("");
            //FileSystem hdfs=FileSystem.get(URI.create(Misc.S3FS),getConfiguration());
            logger.setLevel(Level.ALL);

            //StreamHandler handler=new StreamHandler(hdfs.create(new Path(Misc.LOGS_PATH+"mylog.log")),new SimpleFormatter());
            FileHandler handler=new FileHandler(Misc.LOGS_PATH+"mylog.xml",true);   
            FileHandler severeHandler=new FileHandler(Misc.LOGS_PATH+"mylogSevere.xml",true);
            severeHandler.setLevel(Level.INFO);
            logger.addHandler(handler);
            logger.addHandler(severeHandler);

        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        return logger;

    }
Run Code Online (Sandbox Code Playgroud)

Jac*_*ski 7

Hadoop带有预配置的log4j.您所要做的就是导入两个类:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Run Code Online (Sandbox Code Playgroud)

现在,您可以在映射器,缩减器和任何您想要的位置定义记录器:

private static final Log LOG = LogFactory.getLog(MyClass.class);
Run Code Online (Sandbox Code Playgroud)

并记录您需要的内容:

LOG.info("My message");
Run Code Online (Sandbox Code Playgroud)

这些消息将在作业执行期间显示.您可以使用调整log4j配置

conf/log4j.properties
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是尝试了你的方法它似乎没有用。它仍然只显示地图 % reduce % 并且没有出现我的日志消息。 (2认同)