需要为JUL关闭其他FileHandler吗?

时间:2011-05-13 16:53:25

标签: java java-ee websphere java.util.logging

我正在使用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

2 个答案:

答案 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。您使用的是哪个应用服务器?