为什么没有显示Level.FINE日志记录消息?
|
Doc0ѭ状态的JavaDocs:
级别降序为:
SEVERE
(最高价)
WARNING
INFO
CONFIG
FINE
FINER
FINEST
(最低价)
资源
import java.util.logging.*;
class LoggingLevelsBlunder {
public static void main(String[] args) {
Logger logger = Logger.getAnonymousLogger();
logger.setLevel(Level.FINER);
System.out.println(\"Logging level is: \" + logger.getLevel());
for (int ii=0; ii<3; ii++) {
logger.log(Level.FINE, ii + \" \" + (ii*ii));
logger.log(Level.INFO, ii + \" \" + (ii*ii));
}
}
}
输出量
Logging level is: FINER
Jun 11, 2011 9:39:23 PM LoggingLevelsBlunder main
INFO: 0 0
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 1 1
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 2 4
Press any key to continue . . .
问题陈述
我的示例将Level
设置为FINER
,因此我希望每个循环看到2条消息。相反,我为每个循环看到一条消息(缺少Level.FINE
条消息)。
题
为了看到FINE
(,FINER
或FINEST
)输出,需要进行哪些更改?
更新(解决方案)
感谢Vineet Reynolds的回答,该版本可以按照我的期望工作。它显示3 xINFO
消息和3 xFINE
消息。
import java.util.logging.*;
class LoggingLevelsBlunder {
public static void main(String[] args) {
Logger logger = Logger.getAnonymousLogger();
// LOG this level to the log
logger.setLevel(Level.FINER);
ConsoleHandler handler = new ConsoleHandler();
// PUBLISH this level
handler.setLevel(Level.FINER);
logger.addHandler(handler);
System.out.println(\"Logging level is: \" + logger.getLevel());
for (int ii=0; ii<3; ii++) {
logger.log(Level.FINE, ii + \" \" + (ii*ii));
logger.log(Level.INFO, ii + \" \" + (ii*ii));
}
}
}
没有找到相关结果
已邀请:
7 个回复
誓猎贰
或更高的日志记录,以获得所需的结果。 我建议阅读《 Java日志记录概述》指南,以了解基础设计。该指南涵盖了Logger和Handler概念之间的区别。 编辑处理程序级别 1.使用配置文件 可以修改java.util.logging属性文件(默认为
中的
文件)以更改ConsoleHandler的默认级别:
2.在运行时创建处理程序 不建议这样做,因为这会导致覆盖全局配置。在您的整个代码库中使用此功能将导致记录器配置可能无法管理。
膏焦凑
的根记录器,并附带了一个默认为
的ConsoleHandler。
低于
,因此默认情况下不会显示精细消息。 解决方案1 为您的整个应用程序创建一个记录器,例如从您的软件包名称中输入,或使用
,然后将您自己的ConsoleLogger挂接到该软件包上。 然后,要么要求root记录器关闭(以避免重复输出更高级别的消息),要么让记录器不要将日志转发到root。
解决方案2 或者,您可以降低根记录器的栏。 您可以通过代码设置它们:
或使用日志记录配置文件(如果正在使用):
通过降低全局级别,您可能会开始看到来自核心库的消息,例如来自某些Swing或JavaFX组件的消息。 在这种情况下,您可以在根记录器上设置过滤器,以过滤掉不是来自程序的消息。
蓄荣糖些
粱委教
具有默认为
的根记录器,而附加到该根记录器的
也默认为
。因此,要查看
(,
或
)输出,需要将根记录器的默认值及其and19ѭ设置为
,如下所示:
您的更新问题(解决方案) 如@mins所述,您将在控制台上为
及更高版本两次打印消息:首先由匿名记录器,然后由其父记录器,即根记录器,根记录器默认情况下也将
设置为
。要禁用root logger,您需要添加以下代码行:
还有其他方法可以防止@Sheepy提到的root记录程序的默认控制台处理程序处理日志,例如:
但是
行不通,因为它仅阻止直接传递到根记录器的消息,而不阻止来自子记录器的消息。为了说明ѭ50的工作原理,我画了下图:
设置日志级别,指定此记录器将记录哪些消息级别。低于此值的消息级别将被丢弃。级别值Level.OFF可用于关闭日志记录。如果新级别为null,则表示此节点应使用特定的(非null)级别值从最近的祖先继承其级别。
完趣镐
蜗仓馈
峨躬坎抬焚
从代码加载属性文件: