一尘不染

为什么没有显示Level.FINE日志记录消息?

java

状态的JavaDocsjava.util.logging.Level


级别降序为:

  • 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 . . .

问题陈述

我的示例将设置LevelFINER,因此我希望每个循环看到2条消息。相反,我为每个循环看到一条消息(Level.FINE消息丢失)。

为了查看FINEFINERFINEST)输出,需要进行哪些更改?

更新(解决方案)

感谢Vineet Reynolds的回答,该版本可以按照我的期望工作。它显示3条INFO消息和3条FINE消息。

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

阅读 336

收藏
2020-09-08

共1个答案

一尘不染

记录器仅记录消息,即它们创建日志记录(或记录请求)。它们不会将消息发布到目的地,这由处理程序负责。设置记录器的级别只会导致它 _创建_与该级别或更高级别匹配的日志记录。

您可能正在使用ConsoleHandler(我无法推断您的输出是System.err还是文件,但是我认为它是前者),默认情况下,该级别将发布该级别的日志记录Level.INFO。您将必须配置此处理程序,以发布级别Level.FINER和更高级别的日志记录,以获得所需的结果。

我建议阅读《Java日志记录概述》指南,以了解基础设计。该指南涵盖了Logger和Handler概念之间的区别。

编辑处理程序级别

1.使用配置文件

所述的java.util.logging属性文件(默认情况下,这是logging.properties在文件JRE_HOME/lib)可以被修改,以改变ConsoleHandler的缺省级别:

java.util.logging.ConsoleHandler.level = FINER

2.在运行时创建处理程序

不建议这样做,因为这会导致覆盖全局配置。在您的整个代码库中使用此命令将导致记录器配置可能无法管理。

Handler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.FINER);
Logger.getAnonymousLogger().addHandler(consoleHandler);
2020-09-08