我正在使用java.util.logging.Logger
登录我的程序。如何为单个类启用FINE
日志记录,同时为每个其他类设置WARNING
?
我更喜欢在我的main()
方法中以编程方式执行此操作,而不是需要设置其他属性文件。
答案 0 :(得分:1)
Logger log = Logger.getLogger(this.getClass().getName()).setLevel(Level.FINE);
答案 1 :(得分:1)
如果你不想为每个有问题的类定义一个记录器,而是想在类之间共享记录器,你可以选择实现自己的java.util.logging.Handler,它有自己的类过滤方式名称使用LogRecord.getSourceClassName()。
提供的信息答案 2 :(得分:1)
我知道OP已经要求以编程方式执行此操作,但这里也是如何在属性文件中执行此操作的示例。
警告:我认为它值得包含,因为标题不以编程方式表示,许多开发人员希望通过logging.properties来管理它。此外,关于这一点并没有真正的在线,它可能会令人困惑,并且与log4j
略有不同根目录日志级别由.level
config指示。这决定了默认情况下捕获哪些事件并“分发”以进行日志记录。根日志记录级别是日志记录层次结构中“根记录器”使用的级别。请参阅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。
答案 3 :(得分:0)
我相信您可以将Handler
和特定类Logger
的日志级别设置为FINE,同时将其余代码库的所有其他Logger
保留为警告应该做的伎俩。 Logger
和Handler
都需要通过级别过滤器才能记录消息。
答案 4 :(得分: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);
}