2009-02-06 55 views
5

我正在配置Java应用程序的日志记录。我的目标是两个日志:一个用于所有消息,另一个用于超出特定级别的消息。从java.util.logging中分离INFO和ERROR日志

该应用使用java.util.logging.*类:我正在使用它,所以我仅限于通过logging.properties文件进行配置。

我不明白的方式以不同的方式配置两个FileHandlers:文档和例子我见过像设置属性:

java.util.logging.FileHandler.level = INFO 

虽然我想要两个不同的处理程序,在不同层次不同的文件记录。

有什么建议吗?

回答

4

http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/overview.html很有帮助。您只能为任何单独的记录器设置一个Level(正如您可以通过记录器上的setLevel()方法所了解的那样)。但是,您可以采用两个常用级别中的最低级别,然后以编程方式进行筛选。

不幸的是,你不能仅仅通过配置文件来做到这一点。要只用配置文件进行切换,您必须切换到log4j之类的东西,您所说的不是一种选择。

所以我建议改变日志代码,使用滤镜,像这样的东西:

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(新LevelFilter(Level.INFO))或什么的。如果你想让它可配置文件,你可以使用你自己编写的日志属性设置,并使用普通的属性方法。

我认为设置两个文件处理程序和编程代码的配置代码是相当简单的,一旦你有设计,但如果你想要更多的细节添加评论,我会编辑。

0

我认为你应该能够继承一个处理程序,然后重写方法以允许输出根据消息的级别转到多个文件。这可以通过重写publish()方法来完成。

另外,如果你使用系统提供的文件处理器,你可以做一个使用setfilter()就可以注入自己的过滤器混进去,并在该过滤器的代码,发送的所有邮件到其他文件并且如果LogRecord级别为INFO或更高,则返回true,从而导致FileHandler.publish()将其写入实际文件。

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

+0

我正在使用应用程序 - 我不想在此处编写代码:只需配置属性文件的日志记录即可。 – user63196 2009-02-06 15:21:43

+0

然后它不能完成。你所要求的不是你正在使用的日志系统的功能。如果这就是你必须使用的,那恐怕你运气不好。 – paxdiablo 2009-02-06 23:05:09