Problem with java.util.logging and Lock file

I have an application that scans a set of files. And this scan happens in parallel. I mean, if I upload 5 files, five processes will be created and the job will start in parallel. Now, for registering exceptions for running tasks, there is only one log file. The problem is that logger creates a lot of log files, because -

mylogfile.log(actual log file)

mylogfile.log.1

mylogfile.log.2

mylogfile.log.3

mylogfile.log.4

mylogfile.log.5
...

with their respective lock files. Below is the code snippet that I used:

  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;
}

To ensure that you can use only one log file to record exceptions for all jobs running in parallel.

Thanks,

Anish

+3
source share
3 answers

. 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 , .

+1

singlton, , ( , ).

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

I am facing the same problem, and what I was missing is standard programming practice, after which I have to close the file handler after registration is complete. This way you can create multiple logs, but remember to close them at the end.

Following the two lines in the following example:

  • 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
source

Source: https://habr.com/ru/post/1713062/


All Articles