【发布时间】:2010-11-02 08:31:49
【问题描述】:
我正在使用java.util.logging.Logger 登录我的程序。如何为单个类启用 FINE 日志记录,同时为每个其他类设置为 WARNING?
我更愿意在我的 main() 方法中以编程方式执行此操作,而不是需要设置其他属性文件。
【问题讨论】:
-
和stackoverflow.com/questions/470430/…基本一样的问题。
我正在使用java.util.logging.Logger 登录我的程序。如何为单个类启用 FINE 日志记录,同时为每个其他类设置为 WARNING?
我更愿意在我的 main() 方法中以编程方式执行此操作,而不是需要设置其他属性文件。
【问题讨论】:
我知道 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 级别?
嗯,这是我添加到邮件类中的一种方法,它确实有效。我仍然欢迎其他人的任何改进。
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);
}
【讨论】:
如果您不想为所讨论的每个类定义一个记录器,而是希望在类之间共享记录器,您也可以实现自己的 java.util.logging.Handler,它有自己的类过滤方式使用 LogRecord.getSourceClassName() 提供的信息命名。
【讨论】:
我相信您可以将 Handler 和特定类 Logger 的日志级别设置为 FINE,同时将其余代码库的所有其他 Loggers 保留为 WARNING 应该可以解决问题。 Logger 和Handler 都需要通过级别过滤器才能记录消息。
【讨论】:
Logger log = Logger.getLogger(this.getClass().getName()).setLevel(Level.FINE);
【讨论】: