[英]Problem with java.util.logging and Lock file
我有一个扫描一组文件的应用程序。 并且这种扫描是平行进行的。 我的意思是,如果我上传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;
}
如何确保只应使用一个日志文件来编写并行运行的所有作业的例外。
谢谢,
阿尼什
我面临同样的问题,我缺少的是一个标准的编程实践,我应该在完成日志记录后关闭文件处理程序。 因此,您可以创建多个记录器,但请确保在最后关闭它们。
以下示例中的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;
}
}
这与并行调用没有多大关系。 每次调用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的引用。 Sun概述提供了有关如何通过属性文件配置日志记录的更多想法。
您可以使用可以从中检索记录器的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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.