4

我正在学习 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

4

1 回答 1

4

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

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

然后在我的主类中,我向这个全局日志添加一个处理程序(记录消息被 Netbeans 捕获并最终出现在我的控制台窗口中,所以我想将消息写入一个文件,以便稍后检查):

    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 生成的消息将指示它们来自哪个类。

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

于 2012-11-15T13:27:33.903 回答