TL;DR
Logback不支持在日志记录器名称的中间级别使用通配符。
详细信息
Logback(隐式地)支持在日志记录器名称的末尾使用通配符,因此<logger name="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");
显然,这种方法也有缺点。我只是提出它来展示除了完全限定类名之外,还有另一种方式可以将记录器实例关联起来并对其应用级别。