【问题标题】:Logback logger name with wildcard带通配符的 Logback 记录器名称
【发布时间】:2018-07-17 08:17:50
【问题描述】:

是否可以为记录器名称使用通配符来匹配不同的包,这样我们就不必单独指定它们?所以不要写

<logger name="com.package1.web" level="debug"   
<logger name="com.package2.web" level="debug"  
<logger name="com.package3.web" level="debug"  

我只想指定一个类似这样的条目:

<logger name="com.*.web" level="debug"  

如果有人知道一种方法,或者只是它不可能,我会非常感激

【问题讨论】:

    标签: logging logback


    【解决方案1】:

    TL;DR

    Logback 不支持 logger 名称中中间级别的通配符。

    详情

    Logback(隐式)支持在记录器名称的末尾使用通配符,因此&lt;logger name="com.package1.web" ...&gt; 实际上意味着:

    • com.package1.web 中的类com.package1.web 的任何子包中

    Logback 通过创建记录器的层次结构来做到这一点; com.package1.web 的记录器的父级是 com.package1 的记录器,com 的记录器是ROOT 记录器的父级。

    因此,如果您声明&lt;logger name="com.package1.web" level="debug"&gt;,然后尝试为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");
    

    显然,这种方法也有缺点,我在这里提到它只是为了表明还有另一种方法(除了完全限定的类名)来关联记录器实例并对其应用级别。

    【讨论】:

      【解决方案2】:

      您可以使用附加程序中的过滤器来做到这一点。基本上你必须为com.* 设置一个具有DEBUG 级别的记录器,并应用一个过滤器DENIES 所有DEBUG(或更低)事件NOT com.*.web.

      我承认这很复杂。

      性能方面也很差:DEBUG 事件是为 所有 com.* 事件创建的,并且仅在附加程序中它们被丢弃或保留。

      无论如何,例如logback.xml文件:

      <configuration scan="true" debug="true">
          <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
              <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
                  <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
                      <expression>
                          !(e.loggerName ==~ "com\\..*\\.web") &amp;&amp;
                          DEBUG.toInt() >= e.level.toInt()
                      </expression>
                  </evaluator>
                  <OnMismatch>NEUTRAL</OnMismatch>
                  <OnMatch>DENY</OnMatch>
              </filter>
              <encoder>
                  <pattern>%p [%d{HH:mm:ss,SSS}] %c - %m\n</pattern>
              </encoder>
          </appender>
      
          <logger name="com" level="DEBUG" />
      
          <root level="INFO">
              <appender-ref ref="CONSOLE" />
          </root>
      </configuration>
      

      测试代码:

      public void test() throws Exception{
          getLogger("com.package1.web").debug("some debug onto com.package1.web");
          getLogger("com.package2.web").debug("some debug onto com.package2.web");
          getLogger("com.package3.web").debug("some debug onto com.package3.web");
          getLogger("com.package1.web").info("some info onto com.package1.web");
          getLogger("com.package2.web").info("some info onto com.package2.web");
          getLogger("com.package3.web").info("some info onto com.package3.web");
          getLogger("com.package3.notweb").debug("some debug onto com.package3.notweb");
          getLogger("com.package3.notweb").info("some info onto com.package3.notweb");
      }
      
      public Logger getLogger(String loggerName) {
          return LoggerFactory.getLogger(loggerName);
      }
      

      结果:

      DEBUG [12:30:46] com.package1.web - some debug onto com.package1.web
      DEBUG [12:30:46] com.package2.web - some debug onto com.package2.web
      DEBUG [12:30:46] com.package3.web - some debug onto com.package3.web
      INFO [12:30:46] com.package1.web - some info onto com.package1.web
      INFO [12:30:46] com.package2.web - some info onto com.package2.web
      INFO [12:30:46] com.package3.web - some info onto com.package3.web
      INFO [12:30:46] com.package3.notweb - some info onto com.package3.notweb
      

      如您所见,DEBUG 日志仅为com.*.web 编写。

      【讨论】:

        猜你喜欢
        • 2013-06-15
        • 1970-01-01
        • 2017-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-02
        • 2018-04-16
        • 2014-08-02
        相关资源
        最近更新 更多