【问题标题】:Java EE: Strange behavior when implement loggingJava EE:实现日志记录时的奇怪行为
【发布时间】:2011-04-12 22:42:43
【问题描述】:

我使用java.util.logging,并将日志放在应用程序托管 bean 中,因为我认为整个应用程序应该只有一个记录器。

@ManagedBean(name="logging")  
@ApplicationScoped
public class Logging {

    private static Logger logger = Logger.getLogger(Logger.class.getName());
    private static FileHandler fh = null;

    public Logging() {
        try{
            fh = new FileHandler("DMBackingBean");
        }catch(IOException ignore){}
        logger.addHandler(fh);
        logger.setLevel(Level.ALL);
    }

    public Logger getLogger(){
        return logger;
    }
}

这是我遇到的奇怪行为。当我第一次运行程序时,我在DMBackingBean 中记录了AAA。然后我重新部署应用程序(新会话),现在我看到创建了另一个日志文件,DMBackingBean.1,内容为AAADMBackingBean 的包含现在是
AAA
AAA

两个问题:将日志记录放在应用程序范围的 bean 中是否标准?有没有办法让我将所有日志附加到一个文件中,而不是每次我重新部署(新会话)时都会创建一个新日志文件?

【问题讨论】:

  • 你有没有得到这个答案?我也有同样的问题。

标签: java logging jakarta-ee


【解决方案1】:

将日志记录放在应用程序范围的 bean 中是否标准?

IMO,更典型的是创建记录器的层次结构,以便您可以以细粒度方式激活和控制日志记录(例如,配置com.acme.Foo 以在错误级别记录,同时在调试中配置com.acme.bar.BAR 的日志记录级别)。

有没有办法让我将所有日志附加到一个文件中,而不是每次重新部署(新会话)时都会创建一个新日志文件?

看起来您需要创建一个附加文件处理程序:

try { 
    // Create an appending file handler
    boolean append = true; 
    FileHandler handler = new FileHandler("my.log", append); 
    ...
}

参考文献

【讨论】:

  • 我尝试FileHandler handler = new FileHandler("my.log", true),但每次我重新运行应用程序时它仍然会创建新的日志文件。知道为什么吗?
【解决方案2】:

在取消部署 bean 时,您需要撤消您的日志记录。否则,您将在每次重新部署时添加一个新的。

【讨论】:

  • 如何撤消日志?能具体一点吗?
  • 你调用“addHandler(...)”。当该部署消失时,您也需要调用相反的方法。认为它类似于 close()。
猜你喜欢
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多