有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Util日志记录层次结构原因?

我正在学习java。util。日志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

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

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


共 (1) 个答案

  1. # 1 楼答案

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

    下面是我如何使用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。由于我获取文件记录器的方式,fileLog生成的消息将指示它们来自哪个类

    现在,如果我改变主意,不知道如何以及在哪里存储所有这些日志消息,我只需要更改主类中的几行代码,整个应用程序中的所有日志消息都将被定向到这个新位置。我还可以更改主记录器的级别,以便生成更少的消息,但随后可以提高某些类级别记录器的级别,以获取有关代码这一部分的更多信息