Java Util Logging Hierarchy原因?

时间:2012-11-15 12:53:32

标签: java logging java.util.logging

我正在学习java.util.Logging API,我无法理解它为什么会产生冗余输出,如下面的示例代码所示:

Logger logger      = Logger.getLogger("");
Logger logger1     = Logger.getLogger("1");
Logger logger1_2   = Logger.getLogger("1.2");

logger1    .addHandler(new ConsoleHandler());
logger1_2  .addHandler(new ConsoleHandler());

logger     .info("msg:");
logger1    .info("msg: 1");
logger1_2  .info("msg: 1.2");

控制台的输出:

14-01-2012 10:32:41 java.util.logging.LogManager$RootLogger log
INFO: msg:
14-01-2012 10:32:42 logging.LoggingExamples main
INFO: msg: 1
14-01-2012 10:32:42 logging.LoggingExamples main
INFO: msg: 1
14-01-2012 10:32:42 logging.LoggingExamples main
INFO: msg: 1.2
14-01-2012 10:32:42 logging.LoggingExamples main
INFO: msg: 1.2
14-01-2012 10:32:42 logging.LoggingExamples main
INFO: msg: 1.2

为什么日志消息传递给父母并且同一消息显示多次!?这完全没有效率,并且日志文件对于重复信息将增加得太快。谁知道为什么?这是Logging应该具备的性质吗?

注意:示例代码是从http://tutorials.jenkov.com/java-logging/logger-hierarchy.html

复制的

1 个答案:

答案 0 :(得分:3)

我认为问题在于,当您只应将其添加到顶级实例时,您正在为每个Log实例添加处理程序。

以下是我在实践中使用java.util.Loggin的方法: 在我的主类中,我从包名创建一个全局记录器:    globalLog = Logger.getLogger("thornworks");

在我的主类中,我然后为这个全局日志添加一个处理程序(日志消息被Netbeans捕获并最终在我的控制台窗口中,所以我想将消息写入我以后可以预期的文件中):< / p>

    Date now = new Date();
    java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("D_hh_mm");
    String logName = "[baseFilename]" + df.format(now);
    File logFolder = new File(someDirectory, "logs");
    try {
        if(!logFolder.exists())
            logFolder.mkdir();
        File logFile = new File(logFolder,logName+".log");
        Handler logFileHandler = new FileHandler(logFile.getAbsolutePath());
        logFileHandler.setFormatter(new SimpleFormatter());
        globalLog.addHandler(logFileHandler);            
    }
    catch(java.io.IOException ioe) { /* Log file could not be created. */  }
    globalLog.setLevel(Level.INFO);

然后,需要执行某些日志记录的其他类会从此全局记录器创建记录器:

例如,fileLogger = GUI.globalLog.getLogger(FileFunction.class.getName());

此记录器的名称现在为thornworks.FileFunction。由于它是父记录器globalLog的子节点,因此fileLogger生成的所有消息都会传递给globalLog。由于我获取fileLogger的方式,fileLog生成的消息将指示它们来自哪个类。

现在,如果我改变主意,想要存储所有这些日志消息的方式和位置,我只需要在主类中更改几行代码,并且整个应用程序中的所有日志消息都将被定向到这个新的位置。我还可以更改主记录器的级别,以便生成更少的消息,但随后增加某个类级别记录器的级别以获取有关该部分代码的更多信息。