我正在使用java util logging来登录小型Java EE应用程序。要添加额外的FileHandler(例如用于错误/警告),我创建了一个LoggerFactory,它创建了实际的记录器,并将文件处理程序静态添加到“主”记录器。
package de.il.myapp.logging;
public class LoggerFactory {
private static final java.util.logging.Logger MAIN_LOGGER = java.util.logging.Logger.getLogger("de.il.myapp");
static {
try {
final java.util.logging.FileHandler fh = new java.util.logging.FileHandler("error.log", 1024*1024, 5, true);
fh.setLevel(Level.WARNING);
final java.util.logging.Formatter formatterTxt = new java.util.logging.SimpleFormatter();
fh.setFormatter(formatterTxt);
MAIN_LOGGER.addHandler(fh);
} catch (final IOException e) {
//...
}
}
}
public static final Logger getLogger(final Class<?> clazz){
return java.util.logging.Logger.getLogger(clazz);
}
}
一切正常,但是当我停止应用程序时,lck文件仍然存在。一开始,创建了一个新的lck。因此,在一些重新启动后,目录看起来像这样。
error.log.0
error.log.0.1
error.log.0.1.lck
error.log.0.2
error.log.0.2.lck
error.log.0.3
error.log.0.3.lck
error.log.0.lck
问题是:我该如何避免这种情况?我必须在最后关闭文件处理程序吗?但是哪里?由于这是一个Java EE应用程序,我不是一个退出点,是吗?为什么我得到..log.0.X的日志文件,而不仅仅是..log.0?
谢谢, INGO
答案 0 :(得分:0)
首先,不允许在EJB中使用java.io
类:
规范第21.2.2节:
企业bean不得使用 java.io包尝试访问 文件和文件中的文件 系统
这意味着您也不应该使用依次使用java.io
类的类,除非您通过询问容器来获取它们。
但是,如果您创建一个急切加载的单例会话bean并在@PreDestroy
上执行清理:
@Startup
@Singleton
public class FileHandlerCloser {
@PreDestroy
public void closeFileHandlers() {
// close file handlers
}
}
规范对此并不十分清楚,但我认为在所有其他bean之后销毁单例bean。
答案 1 :(得分:0)
在Glassfish中,您可以使用Lifecycle Listeners。在JBoss中,您可以使用StartupServiceMBean
。您使用的是哪个应用服务器?