使用logback定义父级或超级记录器名称

时间:2018-06-07 09:00:32

标签: 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" 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完成后,每个人都会忘记哪些软件包与之相关,因此保留这些父级记录器将有助于解决未来的问题。

1 个答案:

答案 0 :(得分:1)

如果我理解你要求的东西,你就会有一个&#34;组件的概念。它跨越Java包,并且您希望根据它所在的组件来处理设置日志记录级别,而不一定是它所在的组件。我看到了一些可以采用的方法。 / p>

  1. 虽然记录器名称的标准是基于类名(以及该类所在的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的日志记录级别以获取该组件下的所有记录器。它有点不同寻常,可能会让开发人员对您的项目感到困惑,但如果您真的希望您的日志记录层次结构和您的包层次结构不同,那么您可以做到这一点。

  2. 另一种方法是保留您的日志记录名称层次结构,但使用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架构有。标记机制非常强大,只要您的消息上有正确的标记,并且您设置日志配置以过滤到具有正确过滤器的消息,您就可以使用它做任何事情。

  3. 我能想到的另一种方法是基本上继续做你现在正在做的事情,并在调试级别指定很多单独的记录器,但是这个&#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,可能会让人感到困惑,但我可以想象这对某些团队来说效果不错。它也不需要任何代码更改,这可能是一个加号。

  4. Logback和SLF4J拥有很多的力量和可能性,这是(通常)的优点和缺点,因为它可能需要一段时间来了解他们可以做的一切。但通常人们可以找到一种方法让他们以自己想要的方式工作,有时人们可以找到一种比人们想象的更好的方式。