从java.util.logging中分离INFO和ERROR日志

时间:2009-02-06 05:38:35

标签: java logging

我正在为Java应用程序配置日志记录。我的目标是两个日志:一个用于所有消息,一个用于高于特定级别的消息。

该应用使用java.util.logging.*类:我按原样使用它,所以我只能通过logging.properties文件进行配置。

我没有看到以不同方式配置两个FileHandler的方法:我见过的文档和示例设置了以下属性:

java.util.logging.FileHandler.level = INFO

虽然我希望两个不同的处理程序在不同级别登录到不同的文件。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/overview.html很有帮助。您只能为任何单个记录器设置一个级别(您可以从记录器上的setLevel()方法中获知)。但是,您可以采用两个常用级别中的最低级别,然后以编程方式进行过滤。

不幸的是,您不能仅使用配置文件执行此操作。要仅使用配置文件进行切换,您必须切换到类似log4j的内容,而您所说的不是一个选项。

所以我建议使用Filters修改代码中的日志记录:

class LevelFilter implements Filter {
    private Level Level;
    public LevelFilter(Level level) {
        this.level = level;
    }
    public boolean isLoggable(LogRecord record) {
        return level.intValue() < record.getLevel().intValue();
    }
}

然后在第二个处理程序上,执行setFilter(new LevelFilter(Level.INFO))或其他任何操作。如果您希望文件可配置,您可以使用自己编写的日志属性设置,并使用常规的属性方法。

我认为设置两个文件处理程序和程序代码的配置代码在设计完成后非常简单,但如果您想要更多细节,请添加注释,我将进行编辑。

答案 1 :(得分:0)

我认为您应该能够只处理一个处理程序,然后覆盖这些方法,以允许输出转到多个文件,具体取决于消息的级别。这可以通过覆盖publish()方法来完成。

或者,如果您 使用系统提供的FileHandler,您可以在其上执行setFilter()以将您自己的过滤器注入混合中,并在该过滤器代码中发送所有消息到你的另一个文件,如果LogRecord级别为INFO或更高,则返回true,导致FileHandler.publish()将其写入真实文件。

我不确定这是你应该使用过滤器的方式,但我不明白为什么它不起作用。