4

我有一个扫描一组文件的应用程序。这种扫描是并行进行的。我的意思是如果我上传 5 个文件,将创建五个进程并开始并行执行作业。现在为了记录正在运行的作业的异常,只有一个日志文件。即将出现的问题是,记录器会创建很多日志文件,例如 -

mylogfile.log(actual log file)

mylogfile.log.1

mylogfile.log.2

mylogfile.log.3

mylogfile.log.4

mylogfile.log.5
...

与他们各自的锁定文件。下面是我使用的代码片段:

  public static Logger getLogger(final String className) {
    final Logger logger = Logger.getLogger(className);
    FileHandler fh;
    try {
        // This block configure the logger with handler and formatter
        fh = new FileHandler("mylogfile.log", true);
        logger.addHandler(fh);
        logger.setLevel(Level.ALL);
        logger.setUseParentHandlers(false);
        fh.setFormatter(new SimpleFormatter());
    } catch (final SecurityException e) {
        //          }
    } catch (final IOException e) {
        //
    }
    return logger;
}

如何确保只使用一个日志文件来写入所有并行运行的作业的异常..??

谢谢,

阿尼什

4

3 回答 3

2

我面临同样的问题,我缺少的是一个标准的编程实践,我应该在完成日志记录后关闭文件处理程序。因此,您可以创建多个记录器,但请确保最后关闭它们。

以下示例中的 2 行:

  • successLogFileHandler.close();
  • failureLogFileHandler.close();

class LoggerExample {
    private Logger  loggerFailure;
    private Logger  loggerSuccess;

    public void myLogger() {
        // some code block
        FileHandler successLogFileHandler = new FileHandler(successLogFile.getAbsolutePath());
        FileHandler failureLogFileHandler = new FileHandler(failureLogFile.getAbsolutePath());
        // Create loggers
        loggerFailure = createLogger(STR_FAILURE_LOG_FILE, failureLogFileHandler, Level.INFO, customFormatter);
        loggerSuccess = createLogger(STR_SUCCESS_LOG_FILE, successLogFileHandler, Level.INFO, customFormatter);
        // Write messages into loggers
        // and at the end close the file handlers
        successLogFileHandler.close();      
        failureLogFileHandler.close();
    }

    public static Logger createLogger(String strLoggerName, FileHandler handler, Level level, Formatter formatter) throws Exception
    {
        Logger logger = Logger.getLogger(strLoggerName);
        logger.setLevel(level);
        handler.setFormatter(formatter);
        logger.addHandler(handler);
        return logger;
    }
}
于 2018-02-14T15:44:59.760 回答
1

这与并行调用没有太大关系。以及每次调用 getLogger 的单线程(即使使用相同的字符串作为参数),您也可以创建一个新的 FileHandler 并将其添加到现有的记录器中。也许您不想每次调用 getLogger 时都进行所有设置-方法。

//now we will create new Filehandler and set it to logger
getLogger("identifier").log(Level.SEVERE, "Log to   one file");
//now we have already one filehandler, but lets add one more
getLogger("identifier").log(Level.SEVERE, "Log to   two files");
//now we have already two filehandlers, but lets add one more
getLogger("identifier").log(Level.SEVERE, "Log to three files");       

配置一次日志记录,之后您可以通过 java.util.loggingLogger.getLogger 获取对记录器的引用。Sun 的概述提供了更多关于如何通过属性文件配置日志记录的想法。

于 2009-07-20T17:41:59.117 回答
1

您可以使用可以从中检索记录器的单例定位器类,这将强制您的应用程序使用一个记录器(这意味着您将拥有一个日志文件)

class LoggerLocator {

    private static LoggerLocator locator = new LoggerLocator();
    private Logger logger;

    /**
     * 
     */
    private LoggerLocator() {
        initLogger();
    }

    /**
     * @return
     */
    public static LoggerLocator getLocator(){
        return locator;
    }

    /**
     * @return
     */
    public Logger getLogger() {
        return logger;
    }

    /**
     * 
     */
    private void initLogger() {
        logger = Logger.getLogger("My General Logger");
        FileHandler fh;
        try {
            // This block configure the logger with handler and formatter
            fh = new FileHandler("mylogfile.log", true);
            logger.addHandler(fh);
            logger.setLevel(Level.ALL);
            logger.setUseParentHandlers(false);
            fh.setFormatter(new SimpleFormatter());
        } catch (final SecurityException e) {
            // }
        } catch (final IOException e) {
            //
        }
    }
}

在您的工作中,您将通过以下调用获得记录器:

Logger logger = LoggerLocator.getLocator().getLogger();
于 2009-07-20T22:33:22.180 回答