Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 使用logback定义父或超级记录器名称_Debugging_Logging_Logback_Slf4j - Fatal编程技术网

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

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"

我正在做一个有很多子模块的大项目。调试组件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,每个人都会忘记与它相关的包,因此保留这些父日志记录器将有助于解决未来的问题。

如果我理解您的要求,您就有了一个跨Java包的“组件”概念,您需要根据它所在的组件(而不一定是它所在的包)来设置日志记录级别。我认为可以采取一些方法

  • 虽然logger name的标准是基于类名(以及该类所在的Java包),但不需要将其用于logger名称。也就是说,您可以有一个不同于包层次结构的记录器层次结构。在您的
    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设置日志级别,以获取该组件下的所有记录器。这有点不合常规,可能会让项目的新开发人员感到困惑,但如果您真的希望日志层次结构和包层次结构有所不同,那么您可以这样做

  • 另一种方法是保持日志名称层次结构不变,但使用SLF4J/Logback的机制“标记”每个组件的每个日志消息

    final Logger logger = LoggerFactory.getLogger(getClass());
    final Marker xyzComponent = MarkerFactory.getMarker("XYZ");
    …
    logger.info(xyzComponent, "A log message");
    
    然后,您可以根据正在查找的标记在Logback中进行设置。它确实要求您保持一致,并确保您关心的每一条消息都带有适当的标记,但这是最接近SLF4J体系结构所具有的“超级记录器”或“组记录器”的。标记机制非常强大,允许您使用它做任何事情,只要您的消息上有正确的标记,并且您将日志记录配置设置为只使用正确的过滤器过滤消息

  • 我能想到的另一种方法是基本上继续做您现在正在做的事情,并在调试级别指定许多单独的记录器,但是在单独的文件中为每个组件设置“调试”日志配置。然后,当您需要调试组件时,只需在主日志记录设置中添加(或取消注释?)相应的

    在文件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>
    
    <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看起来很有希望,我会看看,谢谢。