TL;DR
Logback 不支持 logger 名称中中间级别的通配符。
详情
Logback(隐式)支持在记录器名称的末尾使用通配符,因此<logger name="com.package1.web" ...> 实际上意味着:
-
com.package1.web 中的类和在com.package1.web 的任何子包中
Logback 通过创建记录器的层次结构来做到这一点; com.package1.web 的记录器的父级是 com.package1 的记录器,com 的记录器是ROOT 记录器的父级。
因此,如果您声明<logger name="com.package1.web" level="debug">,然后尝试为com.package1.web.foo.bar 上的记录器发出调试日志消息,Logback 将遍历该记录器的层次结构,直到找到启用了DEBUG 级别的记录器,它将在 com.package1.web 找到它,因此它会发出 DEBUG 日志事件。
但是,Logback 不会在记录器名称的中间级别基于通配符创建层次结构。所以,这个……
<logger name="com.*.web" level="debug">
... 不会导致 Logback 为以下对象创建记录器:
com.package1.web
com.package2.web
com.package3.web
当通配符出现在记录器名称的中间级别时,不会应用 Logback 的层次结构。
可能的解决方案
这种层次结构行为的一个好处是它允许您将记录器配置应用到一个包和该包下的所有类,即它根据其父级在记录器实例之间创建一个关联。您可以通过提供明确的记录器名称来建立这种关联,而不是将其默认为当前类名称。
例如:
<logger name="DEBUG_LOGGER" level="debug">
然后在任何你想使用调试记录器的地方创建一个 Logger 实例,如下所示:
private final Logger logger = LoggerFactory.getLogger("DEBUG_LOGGER");
显然,这种方法也有缺点,我在这里提到它只是为了表明还有另一种方法(除了完全限定的类名)来关联记录器实例并对其应用级别。