标准Java日志库设计得真心不好用

标准Java日志库设计得真心不好用,首先是日志级别,居然有fine, finer, finest难道是设计词穷了吗,不会用更有意义单词如debug, true, diag等等。还是这些词被log4j抢去了不好意思和它重名?

还有,获取logger实例时居然不支持class对象,这是个对重构友好的方法,可以保证你重命名类名后,日志输出依然能和输出代码对得上号。但是设计者似乎忘了作为Java的招牌--strong type,这不得不说是一种遗憾。

此外,日志级别要生效不但要在logger上设置还必须在handler上也要设置,不然,根本不起作用。由于默认的jre日志设置仅允许INFO以上的日志往标准错误上输出,如果你不修改设置,那么使用INFO以下级别输出的日志将被忽略。

运行以下代码会输出两遍”INFO: my info log“,但不输出"FINE:my fine log"。

 

 

package org.xyz.logging;

import java.util.logging.*;

public class Nose {
    private static Logger logger = Logger.getLogger("org.xyz.logging");

    public static void main(String argv[]) {
        // Log a FINE tracing message
        ConsoleHandler consoleHandler = new ConsoleHandler();
        logger.addHandler(consoleHandler);
        logger.setLevel(Level.FINE);
        logger.fine("my fine log");
        try{
            Wombat.sneeze();
        } catch (Exception ex) {
            // Log the exception
            logger.log(Level.WARNING, "my warning log", ex);
        }
        logger.info("my info log");
    }

    private static class Wombat {
        public static void sneeze() {

        }
    }
}

 这是因为root logger已经默认有ConsoleHandler配置,代码又加了第二个ConsoleHandler实例,所以输出了两遍。但FINE级别没输出,是因为虽然logger设置了FINE级别,但相应的Handler没有设置成FINE。JRE中默认的配置jre/lib/logging.properties

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

规定了ConsoleHandler的日志级别是INFO。如果要更详尽信息需要调用Handler上的setLevel()方法设置相应的级别。

 

参考:http://stackoverflow.com/questions/6315699/why-are-the-level-fine-logging-messages-not-showing

你可能感兴趣的:(java)