我正在开发一个包含许多子模块的大项目。在调试组件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" 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完成后,每个人都会忘记哪些软件包与之相关,因此保留这些父级记录器将有助于解决未来的问题。
答案 0 :(得分:1)
如果我理解你要求的东西,你就会有一个&#34;组件的概念。它跨越Java包,并且您希望根据它所在的组件来处理设置日志记录级别,而不一定是它所在的组件。我看到了一些可以采用的方法。 / p>
虽然记录器名称的标准是基于类名(以及该类所在的Java包),但您不需要 将其用于您的记录器名称。也就是说,您可以使用与包层次结构不同的记录器层次结构。在com.a.b.c.xyz
课程中,您可以获得一个记录器:
final Logger logger = LoggerFactory.getLogger("com.a.b.xyz.c");
在com.a.b.d.core.xyz
课程中,获取一个记录器:
final Logger logger = LoggerFactory.getLogger("com.a.b.xyz.d.core");
然后您可以使用常规记录器级别定义,设置com.a.b.xyz
的日志记录级别以获取该组件下的所有记录器。它有点不同寻常,可能会让开发人员对您的项目感到困惑,但如果您真的希望您的日志记录层次结构和您的包层次结构不同,那么您可以做到这一点。
另一种方法是保留您的日志记录名称层次结构,但使用SLF4J / Logback的Marker机制来标记&#34;标记&#34;每个组件的每条日志消息。
final Logger logger = LoggerFactory.getLogger(getClass());
final Marker xyzComponent = MarkerFactory.getMarker("XYZ");
…
logger.info(xyzComponent, "A log message");
然后,您可以根据要查找的标记在Logback中设置Filters。它确实要求您保持一致,并确保您关注的每条消息都使用适当的标记进行标记,但它最接近&#34;超级记录器&#34;或&#34;组记录器&#34; SLF4J架构有。标记机制非常强大,只要您的消息上有正确的标记,并且您设置日志配置以过滤到具有正确过滤器的消息,您就可以使用它做任何事情。
我能想到的另一种方法是基本上继续做你现在正在做的事情,并在调试级别指定很多单独的记录器,但是这个&#34; debug&#34;记录单独文件中每个组件的配置设置。然后,当您需要调试组件时,只需在主日志记录设置中添加(或取消注释?)相应的include element。
在文件xyz-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>
在文件abc-debug.xml中:
<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拥有很多的力量和可能性,这是(通常)的优点和缺点,因为它可能需要一段时间来了解他们可以做的一切。但通常人们可以找到一种方法让他们以自己想要的方式工作,有时人们可以找到一种比人们想象的更好的方式。