1

Logger的 Java 文档指出记录器名称应基于类名。Google Guice 在BinderImpl.java中处理这个问题,它执行以下操作:

return member == null
      ? Logger.getAnonymousLogger()
      : Logger.getLogger(member.getDeclaringClass().getName());

但是,由于它为每个类都获取了一个新的记录器,因此我将无法访问可能已添加到记录器中的任何处理程序。

处理在记录器中使用类名和应用一组标准处理程序的最佳方法是什么?

4

1 回答 1

4

该解决方案实际上与 Guice 无关,而是基于日志记录类在 Java 中的工作方式。

记录器是在层次结构中创建的,因此,记录器x.y.z是 的子级x.y,一直到链上的根记录器,其名称为空字符串。每个记录器都从其父级继承属性,例如其记录级别。

因此,为了全局设置日志级别(或全局设置处理程序),只需在根记录器上设置它们:

LogManager logManager = LogManager.getLogManager();
Logger rootLogger = logManager.getLogger("");
rootLogger.setLevel(Level.FINEST);
rootLogger.addHandler(new ConsoleHandler());

一旦完成,任何注入的记录器都将具有从根记录器和可能存在的任何父记录器派生的属性。有关基础知识的更多信息,请参阅LogManager 文档

config属性也存在。根据 LogManager 文档:

属性“配置”。此属性旨在允许运行任意配置代码。该属性定义了一个空格或逗号分隔的类名列表。将为每个命名类创建一个新实例。每个类的默认构造函数可以执行任意代码来更新日志配置,例如设置日志级别、添加处理程序、添加过滤器等。

这意味着该问题有多种解决方案,因为我也可以使用配置类。

于 2010-01-15T15:24:47.630 回答