Debugging 使用logback定义父或超级记录器名称
我正在做一个有很多子模块的大项目。调试组件xyz时,该组件经常访问其他模块中的服务。要记录每个调试消息,我们必须在logback.xml中定义许多记录器 是否可以定义总体超级记录器或父记录器 例如: 而不是写这封信:Debugging 使用logback定义父或超级记录器名称,debugging,logging,logback,slf4j,Debugging,Logging,Logback,Slf4j,我正在做一个有很多子模块的大项目。调试组件xyz时,该组件经常访问其他模块中的服务。要记录每个调试消息,我们必须在logback.xml中定义许多记录器 是否可以定义总体超级记录器或父记录器 例如: 而不是写这封信: <logger name="com.a.b.c.xyz" level="debug" /> <logger name="com.a.b.d.core.xyz" level="debug" /> <logger name="com.a.b.e.xyz"
<logger name="com.a.b.c.xyz" level="debug" />
<logger name="com.a.b.d.core.xyz" level="debug" />
<logger name="com.a.b.e.xyz" level="debug" />
<logger name="com.a.b.e.f.xyz" level="debug" />
<logger name="com.a.b.t.services.xyz" level="debug" />
可以这样定义:
<logger name="xyz-super" level="debug">
<child-logger name="..." />
<child-logger name="..." />
...
</logger>
...
一旦调试完模块xyz,每个人都会忘记与它相关的包,因此保留这些父日志记录器将有助于解决未来的问题。如果我理解您的要求,您就有了一个跨Java包的“组件”概念,您需要根据它所在的组件(而不一定是它所在的包)来设置日志记录级别。我认为可以采取一些方法
com.a.b.c.xyz
类中,您可以获得具有以下功能的记录器:
final Logger logger = LoggerFactory.getLogger("com.a.b.xyz.c");
final Logger logger = LoggerFactory.getLogger("com.a.b.xyz.d.core");
在com.a.b.d.core.xyz
类中,获取具有以下功能的记录器:
final Logger logger = LoggerFactory.getLogger("com.a.b.xyz.c");
final Logger logger = LoggerFactory.getLogger("com.a.b.xyz.d.core");
然后,您可以使用普通的记录器级别定义,为com.a.b.xyz设置日志级别,以获取该组件下的所有记录器。这有点不合常规,可能会让项目的新开发人员感到困惑,但如果您真的希望日志层次结构和包层次结构有所不同,那么您可以这样做final Logger logger = LoggerFactory.getLogger(getClass());
final Marker xyzComponent = MarkerFactory.getMarker("XYZ");
…
logger.info(xyzComponent, "A log message");
然后,您可以根据正在查找的标记在Logback中进行设置。它确实要求您保持一致,并确保您关心的每一条消息都带有适当的标记,但这是最接近SLF4J体系结构所具有的“超级记录器”或“组记录器”的。标记机制非常强大,允许您使用它做任何事情,只要您的消息上有正确的标记,并且您将日志记录配置设置为只使用正确的过滤器过滤消息<included>
<logger name="com.a.b.c.xyz" level="debug" />
<logger name="com.a.b.d.core.xyz" level="debug" />
<logger name="com.a.b.e.xyz" level="debug" />
<logger name="com.a.b.e.f.xyz" level="debug" />
<logger name="com.a.b.t.services.xyz" level="debug" />
</included>
<included>
<logger name="com.a.b.c.abc" level="debug" />
<logger name="com.a.b.d.core.abc" level="debug" />
<logger name="com.a.b.e.abc" level="debug" />
<logger name="com.a.b.e.f.abc" level="debug" />
<logger name="com.a.b.t.services.abc" level="debug" />
</included>
在文件abc-debug.xml中:
<included>
<logger name="com.a.b.c.xyz" level="debug" />
<logger name="com.a.b.d.core.xyz" level="debug" />
<logger name="com.a.b.e.xyz" level="debug" />
<logger name="com.a.b.e.f.xyz" level="debug" />
<logger name="com.a.b.t.services.xyz" level="debug" />
</included>
<included>
<logger name="com.a.b.c.abc" level="debug" />
<logger name="com.a.b.d.core.abc" level="debug" />
<logger name="com.a.b.e.abc" level="debug" />
<logger name="com.a.b.e.f.abc" level="debug" />
<logger name="com.a.b.t.services.abc" level="debug" />
</included>
然后在主logback.xml中:
<!--<include file="xyz-debug.xml"/>-->
<!--<include file="abc-debug.xml"/>-->
当需要调试该组件时,只需取消注释相应的行。当xyz组件是新包的一部分时,如果有人忘记更新xyz-debug.xml,这可能有点繁琐和简单,并且可能会让人感到困惑,但我可以想象,这对于一些团队来说已经足够好了。它也不需要任何代码更改,这可能是一个加号Logback和SLF4J有很多功能和可能性,这(和往常一样)既是优点又是缺点,因为了解他们所能做的一切可能需要一段时间。但通常人们可以找到一种方法让他们按照自己的意愿工作,有时甚至可以找到一种比自己想象的更好的方法。选项2看起来很有希望,我会看看,谢谢。