Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.logging和锁文件存在问题_Java_Logging_Exception Logging - Fatal编程技术网

java.util.logging和锁文件存在问题

java.util.logging和锁文件存在问题,java,logging,exception-logging,Java,Logging,Exception Logging,我有一个扫描一组文件的应用程序。这种扫描是平行进行的。我的意思是,如果我上传5个文件,将创建5个进程,并开始并行执行作业。现在,为了记录正在运行的作业的异常,只有一个日志文件。接下来的问题是,记录器会创建大量日志文件,如下所示- mylogfile.log(actual log file) mylogfile.log.1 mylogfile.log.2 mylogfile.log.3 mylogfile.log.4 mylogfile.log.5 ... 使用各自的锁文件。 下面是我

我有一个扫描一组文件的应用程序。这种扫描是平行进行的。我的意思是,如果我上传5个文件,将创建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;
}
如何确保只使用一个日志文件来写入并行运行的所有作业的异常

谢谢


Anish

这与并行调用没有多大关系。在每次调用getLogger(即使使用与参数相同的字符串)时,您也可以从单个线程创建一个新的FileHandler并将其添加到现有的logger。也许您不希望每次调用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获得对logger的引用。提供有关如何通过属性文件配置日志记录的更多想法。

您可以使用singlton locator类从中检索日志记录程序,这将强制应用程序使用一个日志记录程序(这意味着您将有一个日志文件)

在作业中,您将通过以下调用获取记录器:

Logger logger = LoggerLocator.getLocator().getLogger();

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

以下示例中的两行:

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


您正在使用什么日志框架,如果有的话(或者您是否考虑过使用它)?
Logger logger = LoggerLocator.getLocator().getLogger();
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;
    }
}