【问题标题】:How to enable FINE logging for a single java class如何为单个 java 类启用 FINE 日志记录
【发布时间】:2010-11-02 08:31:49
【问题描述】:

我正在使用java.util.logging.Logger 登录我的程序。如何为单个类启用 FINE 日志记录,同时为每个其他类设置为 WARNING

我更愿意在我的 main() 方法中以编程方式执行此操作,而不是需要设置其他属性文件。

【问题讨论】:

标签: java logging


【解决方案1】:

我知道 OP 要求以编程方式执行此操作,但这里也是如何在属性文件中执行此操作的示例。

警告:我认为它值得包含,因为标题没有以编程方式指示,并且许多开发人员希望通过 logging.properties 来管理它。此外,关于此的在线内容并不多,它可能会令人困惑并且与 log4j 略有不同

根日志级别由.level 配置指示。这规定了默认情况下要捕获和“分发”日志记录的事件。根日志级别是日志层次结构中“根记录器”使用的级别。见this onjava article for more info on the logging hierarchy

在下面,根日志级别设置为 WARNING,因此通常只会捕获 WARNING 事件。这是由层次结构中的所有子记录器继承的,除非您另外配置(稍后):

.level=WARNING

此根日志级别仅指示捕获的内容,而不是“分发”的内容。捕获的事件(消息)如何分发取决于与记录器关联的处理程序。例如,ConsoleHandler 会将事件输出到控制台。例如:

java.util.logging.ConsoleHandler.level = WARNING

此 ConsoleHandler.level 指示此处理程序应分发或打印消息的级别。因此,如果收到带有上述配置的 FINE 消息,则此处理程序将不会打印它。它会打印任何具有警告日志级别或更高级别的消息。

设置为 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 级别?
【解决方案2】:

嗯,这是我添加到邮件类中的一种方法,它确实有效。我仍然欢迎其他人的任何改进。

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);
}

【讨论】:

    【解决方案3】:

    如果您不想为所讨论的每个类定义一个记录器,而是希望在类之间共享记录器,您也可以实现自己的 java.util.logging.Handler,它有自己的类过滤方式使用 LogRecord.getSourceClassName() 提供的信息命名。

    【讨论】:

      【解决方案4】:

      我相信您可以将 Handler 和特定类 Logger 的日志级别设置为 FINE,同时将其余代码库的所有其他 Loggers 保留为 WARNING 应该可以解决问题。 LoggerHandler 都需要通过级别过滤器才能记录消息。

      【讨论】:

        【解决方案5】:
        Logger log = Logger.getLogger(this.getClass().getName()).setLevel(Level.FINE);
        

        【讨论】:

        • 这很接近,但由于两个原因不起作用:1)我希望能够将代码放在我的主类中,因此并非我的实用程序类的所有用户都必须看到 FINE记录。 2) 似乎即使我按照您的建议进行操作,处理程序仍在吞噬我所有的 FINE 消息。
        猜你喜欢
        • 2018-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-29
        • 1970-01-01
        • 2015-08-31
        相关资源
        最近更新 更多