Levels的Java Logging(utils)问题

时间:2013-07-08 07:44:33

标签: java logging

我遇到了java.util.logging的问题...我无法记录精细,精细和最好的关卡。

我在这里找到了理想的解决方案: Why are the Level.FINE logging messages not showing?

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

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主要SCHWERWIEGEND:出了点问题   08.07.2013 09:37:08 xxx.testclass主要SCHWERWIEGEND:出了点问题   08.07.2013 09:37:08 xxx.testclass主要警告:出了什么问题   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”?

1 个答案:

答案 0 :(得分:0)

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

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

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

回到你的问题,我相信JUL中的根记录器默认设置为ConsoleHandler。这意味着,您并不需要自己设置ConsoleHandler,因为每个记录器都将遵循其父级的处理程序,而处理程序依次是根记录程序的处理程序。

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

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