0

我在使用 java.util.logging 的东西时遇到了问题……我无法记录精细、更精细和最精细的级别。

我在这里找到了理想的解决方案: 为什么没有显示 Level.FINE 日志消息?

我创建了自己的类来获取适当的记录器实例:

public static Logger getLogger(Level level, String name) {
        Logger logger;
        logger = (name != null) ? Logger.getLogger(name) : Logger.getAnonymousLogger();
        logger.setLevel(level);
        ConsoleHandler handler = new ConsoleHandler();
        handler.setLevel(level);
        logger.addHandler(handler);

        return logger;
    }

但是在使用它之后,我的记录器会记录每个级别两次:

private static final Logger logger = testlogger.getLogger(Level.INFO, "testname");
    public static void main(String[] args) {

        try {
            throw new IllegalArgumentException("Uuuuu!!!");
        } catch (IllegalArgumentException e) {
            logger.log(Level.SEVERE, "Something wrong");
            logger.log(Level.WARNING, "Something wrong");
            logger.log(Level.INFO, "Something wrong");
            logger.log(Level.CONFIG, "Something wrong");
            logger.log(Level.FINE, "Something wrong");
            logger.log(Level.FINER, "Something wrong");
            logger.log(Level.FINEST, "Something wrong");
        } 
    }

输出:

08.07.2013 09:37:08 xxx.testclass main SCHWERWIEGEND:出了点问题
08.07.2013 09:37:08 xxx.testclass main SCHWERWIEGEND:出了点问题
08.07.2013 09:37:08 xxx.testclass main 警告:出了点问题
08.07。 2013 09:37:08 xxx.testclass 主要警告:出了点问题
08.07.2013 09:37:08 xxx.testclass 主要信息:出了点问题
08.07.2013 09:37:08 xxx.testclass 主要信息:出了点问题

我猜,Logger 添加了一些默认处理程序,所以我尝试过:

for (Handler h : logger.getHandlers()) {
            logger.removeHandler(h);
        }

在添加 ConsoleHanlder 之前,但没有结果。

从我提到的帖子中,我了解到为了显示更好、更精细、最好的关卡,我必须添加 ConsoleHandler。

所以我的问题是“如何强制记录器仅使用 ConsoleHandler”?

4

1 回答 1

0

我以前没有使用过 Java Util Logging,但根据我在 Log4J/SLF4J 方面的经验,你使用 JUL 的方式似乎很奇怪。

我们不会在每次获取记录器时设置处理程序和记录器的级别。通常是在应用程序运行之前一次性设置。这样 JUL 已经正确设置了记录器层次结构,您只需获取要使用的记录器并进行记录。

您进行设置的方式也会造成很大的麻烦,因为每次获得相同的记录器时,您都会添加一个新的 ConsoleHandler。这意味着,如果你得到它 10 次,你从第 10 次得到的记录器,每次记录都会导致 10 条消息显示在屏幕上。

回到你的问题,我相信 JUL 中的根记录器默认设置有 ConsoleHandler 。这意味着,您实际上并不需要自己设置 ConsoleHandler,因为每个记录器都会跟随其父级的处理程序,而后者又会跟随根记录器的处理程序。

删除代码中的 ConsoleHandler 设置并遵循父处理程序。或者您可以将记录器的可加性更改为 false(类似于logger.setUseParentHandlers(false)JUL)。

但是,我的建议是先对 JUL 有一些基本的了解,并知道应该如何使用它。

于 2013-07-08T09:20:21.170 回答