java util日志记录属性中何时需要“.level”?

问题描述

我见过以多种方式配置的 java util 日志记录。通常,完全限定的类名用于记录器名称。在相应的 logging.properties 文件中,我已经看到以几种不同的方式在包级别或类级别配置日志级别。例如,将 com.example.MyClass 的日志级别设置为 FINE:

  • com.example.level = FINE
  • com.example.* = FINE
  • com.example.MyClass = FINE
  • com.example.MyClass.level = FINE

这四个变体都有效吗(假设它们在文件后面没有被覆盖)? 是否有任何选项比其他选项“更正确”? java.util.logging 是否只是假设 .level 不存在?

我尝试找到有关此配置文件的权威指南,但在 https://docs.oracle.com/javase/8/docs/technotes/guides/logging/overview.html#a1.8 似乎没有具体说明。

解决方法

这四个变体都有效吗(假设它们在文件后面没有被覆盖)?

我见过的大多数在线教程都使用明确的 .level 后缀...这是首选(以及为什么)?

在标准 LogManager 下,com.example.* = FINEcom.example.MyClass = FINE 不会改变级别。键必须以 .level 结尾才能更改级别。

根据 LogManager 文档:

名称以“.level”结尾的所有属性都假定为记录器定义日志级别。因此,“foo.level”为名为“foo”的记录器定义了一个日志级别,并(递归地)为其命名层次结构中的任何子级定义了日志级别。日志级别按它们在属性文件中定义的顺序应用。因此,树中子节点的级别设置应该在其父节点的设置之后。属性名称“.level”可用于设置树根的级别。

如果您使用的是 LogManager 的子类,则需要查阅该文档以验证语法。

如果 java.util.logging 不存在,它是否只是假设 .level?

根据文档,它没有。如果您声明的内容没有 .level,则它只会被视为 LogManager entry

是否有任何选项比其他选项“更正确”?

LogManager 属性文件 can't create loggers。这意味着您的日志文件必须与代码创建记录器的方式相匹配。例如,如果您的文件使用 com.example.level = FINE 而您的代码使用 com.example.MyClass1com.example.MyClass2 作为记录器名称,您将永远不会看到 MyClass1 或 MyClass2 切换到 FINE,因为 the code never created package parent logger。 Root 是所有命名记录器的父级,因此这是一次更改多个记录器的理想方式。如果您需要做一些非常复杂的事情,那么您可以使用 LogManager 支持的 config 选项。