当前位置: 首页 > 面试题库 >

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

闻人宏盛
2023-03-14
问题内容

状态的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));
        }
    }
}

问题答案:

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

您可能正在使用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.在运行时创建处理程序

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

Handler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.FINER);
Logger.getAnonymousLogger().addHandler(consoleHandler);


 类似资料:
  • 我正在将一个应用程序从Log4J 1.2.16迁移到Log4J 2.13.3。为此,我使用log4j21.2到2.13.3桥。在我自己的开发机器上,一切都运转良好。但是,当我将应用程序部署到测试服务器时,日志只会发送到根日志记录器,我定义的其他日志文件保持为空。 配置文件完全相同,只是附件中的路径不同。我的开发机器运行Windows,测试服务器运行Linux。该应用程序已部署到Weblogic 1

  • 我怀疑这可能是我包含的一个库,它正在扰乱我的日志。这有可能吗?librray可以改变我的日志显示方式吗?既然我有点迷路了,我该怎么调查呢?

  • 我在ReactJS中工作,我通过API从服务器获取数据。我做了一些搜索过滤,我想显示消息,如果没有记录可用?我是ReactJS的初学者,没有太多关于ReactJS的知识。 代码:

  • 我用的是Android Studio。我编辑了logcat消息,以便只记录要显示的应用程序。但在运行时,我发现logact显示了我的日志和系统日志,如下例所示: 请告诉我为什么logcat仍然显示系统日志

  • 我正在使用卡哈DB作为持久存储来保存ActiveMQ 5.16.4中的消息。 我正在发送持久消息,然后在代理运行时,我正在删除KahaDB日志文件(下图中的),这些文件应该保存队列的消息。但是,删除日志文件似乎不会执行任何操作。在 ActiveMQ 控制台中,我仍然可以看到持久消息,并且我还可以发送更多消息,这些消息由连接的使用者从 Spring Boot 应用程序接收。我认为删除这些日志文件将摆

  • 我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?