Проблема с java.util.logging и файлом блокировки - PullRequest
3 голосов
/ 20 июля 2009

У меня есть приложение, которое сканирует набор файлов. И это сканирование происходит параллельно. Я имею в виду, если я загружу 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;
}

Как убедиться, что для записи исключения всех параллельных заданий должен использоваться только один файл журнала? ??

Спасибо

Аниш

Ответы [ 3 ]

1 голос
/ 21 июля 2009

Вы можете использовать класс локатора синглтона, из которого вы можете извлечь регистратор, который заставит ваше приложение использовать один регистратор (что означает, что у вас будет один файл журнала)

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();
1 голос
/ 14 февраля 2018

Я столкнулся с той же проблемой, и мне не хватало стандартной практики программирования, после которой я должен закрыть обработчик файлов после завершения регистрации. Таким образом, вы можете создать несколько регистраторов, но убедитесь, что закрыли их в конце.

Следующие 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;
    }
}
1 голос
/ 20 июля 2009

Это не имеет ничего общего с параллельными вызовами. Кроме того, из одного потока при каждом вызове вашего 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. Обзор от Sun дает больше идей о том, как настроить ведение журнала через файлы свойств.

...