0

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

谢谢,英戈

4

2 回答 2

0

首先,不允许java.io在 EJB 中使用类:

规范的第 21.2.2 节:

企业 bean 不得使用 java.io 包来尝试访问文件系统中的文件和目录。

这意味着您也不应该使用反过来使用java.io类的类,除非您通过询问容器来获得它们。

但是,如果您创建一个急切加载的单例会话 bean 并在以下位置执行清理@PreDestroy

@Startup 
@Singleton 
public class FileHandlerCloser {

 @PreDestroy
 public void closeFileHandlers() {
  // close file handlers
 }

}

规范对此不是很清楚,但我认为单例 bean 在所有其他 bean 之后被销毁。

于 2011-05-15T15:52:00.447 回答
0

在 Glassfish 中,您可以使用Lifecycle Listeners。在 JBoss 中,您可以使用StartupServiceMBean. 你用的是什么应用服务器?

于 2011-05-15T16:02:48.003 回答