为什么我们需要在 tomcat logging.properties 中编写两次处理程序?

2022-09-01 05:07:14

来自文档

handlers = 1catalina.org.apache.juli.FileHandler, \
       2localhost.org.apache.juli.FileHandler, \
       3manager.org.apache.juli.FileHandler, \
       java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.FileHandler, 
       java.util.logging.ConsoleHandler

我没有找到任何解释为什么需要写入处理程序和.handlers之后?类似的属性文件是否有通用规则?


答案 1

第一行声明可以/将使用的处理程序集,第二行将处理程序分配给特定的记录器(在本例中为根记录器,因为没有前缀)。.handlers

稍后在每个处理程序中进行配置。logging.properties


答案 2

为了扩展soulcheck的答案,我一开始并不理解......

该行可以看作是一个“变量声明”。handlers = ...

handlers = 1catalina.org.apache.juli.FileHandler, \
       2localhost.org.apache.juli.FileHandler, \
       3manager.org.apache.juli.FileHandler, \
       java.util.logging.ConsoleHandler

“我声明一个名称和类型的记录器,一个名称和类型的记录器。一个类型的记录器(没有命名最后一个,因为只有一个,所以没有歧义)。1catalinaFileHandler2localhostFileHandlerConsoleHandler

另一方面,这条线将是一个“任务”。.handlers

.handlers = 1catalina.org.apache.juli.FileHandler, 
       java.util.logging.ConsoleHandler

“我将 1catalina 和控制台处理程序分配给根记录器。这意味着在应用程序中完成的任何日志记录都将转发给这些处理程序(除非被覆盖)”

in指的是你正在应用它的东西。在本例中,由于 左侧没有任何内容,因此您将它应用于根记录器,所有记录器都从中继承。..handlers.

但这与这条线中完全相同的原则:

com.mycompany.MyClass.handlers = java.util.logging.ConsoleHandler

在这种情况下,for 的左侧有一些东西,这意味着我们不会将这些处理程序分配给根记录器,而是分配给特定的记录器。对于此行,您说“我正在覆盖此特定记录器的标准记录器>处理程序分配。在这种情况下,不要像基于根记录器配置那样操作。在这种情况下,我希望您仅使用 该记录器”。..handlersConsoleHandler

因此,这意味着 的任何日志记录将仅发送到,而不是发送到任何其他处理程序。其他类不受此行的影响。MyClassConsoleHandler

再一次,我只是重复灵魂检查的解释,但更详细地说,我需要自己去理解其中的区别。