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 楼答案
我认为问题在于,您正在向每个日志实例添加一个处理程序,而您只应该将其添加到顶级实例
下面是我如何使用java的。util。Loggin在实践中: 在我的主类中,我根据包名创建了一个全局记录器:
globalLog = Logger.getLogger("thornworks");
然后,在我的主类中,我向这个全局日志添加了一个处理程序(日志消息会被Netbeans捕获,并最终出现在我的控制台窗口中,所以我想将消息写入一个文件,以便以后检查):
然后,需要进行一些日志记录的其他类将从这个全局记录器创建记录器:
例如,
fileLogger = GUI.globalLog.getLogger(FileFunction.class.getName());
此记录器的名称现在为
thornworks.FileFunction
。由于它是父记录器globalLog的子记录器,因此fileLogger生成的所有消息都会传递给globalLog。由于我获取文件记录器的方式,fileLog生成的消息将指示它们来自哪个类现在,如果我改变主意,不知道如何以及在哪里存储所有这些日志消息,我只需要更改主类中的几行代码,整个应用程序中的所有日志消息都将被定向到这个新位置。我还可以更改主记录器的级别,以便生成更少的消息,但随后可以提高某些类级别记录器的级别,以获取有关代码这一部分的更多信息