如何为单个Java类启用FINE日志记录

4
我正在程序中使用 java.util.logging.Logger 日志记录。如何在一个类中启用 FINE 日志记录,同时将其他所有类的日志记录级别设置为 WARNING?我希望在我的 main() 方法中以编程方式完成此操作,而不需要设置额外的属性文件。

基本上是与https://dev59.com/xXRB5IYBdhLWcg3w6bUD相同的问题。 - Michael Myers
5个回答

2

我知道 OP 已经要求以编程方式完成,但这里提供一个在属性文件中完成的示例。

注意:我认为这很值得包含,因为标题没有表明是以编程方式,许多开发人员希望通过 logging.properties 进行管理。此外,在线上关于此的信息不是很多,可能会让人感到困惑,与 log4j 稍有不同。

根日志级别由 .level 配置指定。这决定了默认情况下要捕获和“分配”日志记录的事件。根日志级别是日志层次结构中“根记录器”使用的级别。请参见 this onjava article 了解更多关于日志层次结构的信息。

下面,根日志级别设置为 WARNING,因此通常只会捕获 WARNING 事件。这被所有子记录器继承,除非您稍后进行配置:

.level=WARNING

这个记录级别仅指示了被捕获的内容,而不是“分发”的内容。被捕获的事件(消息)如何分发取决于与记录器相关联的处理程序。例如,ConsoleHandler会将事件输出到控制台。例如:
java.util.logging.ConsoleHandler.level = WARNING

此ConsoleHandler.level指示处理程序应分发或打印消息的级别。因此,如果使用上述配置收到FINE消息,则此处理程序将不会将其打印出来。但它会打印任何具有WARNING日志级别或更高级别的消息。
将其设置为ALL将确保ConsoleHandler将所有消息都打印到控制台(我们还需要配置根级别以确保所有消息都被捕获):
.level=ALL
java.util.logging.ConsoleHandler.level = ALL

然而,这将会产生很多我们不希望的噪音。因此,为了将 FINE 级别的事件减少到我们感兴趣的那些类别,我们仅更改这些特定记录器的日志级别:
com.level = WARNING
com.mypackage.MyClass1.level = FINE
com.mypackage.MyClass2.level = FINE
com.mypackage.mysubpackage.MyClass3.level = FINE

请注意,上述代码中,我已经明确将“com”记录器的级别设置为WARNING。

com.mypackage 不会继承 com 并仍然受到 WARNING 级别的限制吗? - Nyerguds
这里提到的“properties file”是指哪个属性文件? - undefined

1
Logger log = Logger.getLogger(this.getClass().getName()).setLevel(Level.FINE);

这很接近,但有两个问题: 1)我想能够将代码放在我的主类中,这样不是所有使用我的实用程序类的用户都必须看到FINE日志记录。 2)似乎即使我按照您的建议做了,处理程序仍然会吞噬我所有的FINE消息。 - DaveMan
setLevel(...) 返回 void,这个例子有语法错误。 - undefined

1
如果您不想为每个相关类定义一个记录器,而是希望在类之间共享记录器,那么您可以实现自己的java.util.logging.Handler,该处理程序具有使用LogRecord.getSourceClassName()提供的信息进行类名过滤的方法。

0

好的,这是我添加到我的邮件类中实际工作的方法。我仍然欢迎其他人提出任何改进意见。

private static void setupLogging() {
  // To enable FINE logging in a single class, apparently this bewildering
  // maze of statements is required.
  Logger.getLogger("").setLevel(Level.FINE);
  for (Handler handler : Logger.getLogger("").getHandlers()) {
    handler.setLevel(Level.FINE);
  }
  MyOtherClass.logger.setLevel(Level.FINE);
  Logger.getLogger("").setLevel(Level.WARNING);
}

0

我认为您可以将处理程序Handler和特定类Logger的日志级别设置为FINE,同时保持代码库中其余所有Logger的日志级别为WARNING,这样应该能解决问题。消息要记录,LoggerHandler都需要通过级别过滤器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接