如何在 logback.xml 中禁用记录器

How to disable logger in logback.xml

我正在使用 logback.xml 文件来设置日志记录环境。这里我有 2 个附加程序,一个用于控制台,另一个用于文件。控制台附加程序将始终打印该值,但文件附加程序需要在需要时打开。

以下是我的配置,其中两个appender STDOUT和file,都加了root。 当我将 level 的值从 OFF 更改为其他值时,我想要控制文件附加程序日志并想要什么,那么只有它应该工作。 目前,如果将级别更改为 OFF,则停止两个 appender 并且无法在控制台上看到任何内容。

<configuration>
  <appender name="STDOUT"
    class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </encoder>
  </appender>

  <appender name="file" class="ch.qos.logback.core.FileAppender">
    <file>/tmp/logback.log</file>
    <append>true</append>
    <immediateFlush>true</immediateFlush>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </encoder>
  </appender>

  <logger name="com.demo" level="OFF">
    <appender-ref ref="file" />
  </logger>

  <root level="info">
    <appender-ref ref="file" />
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

以下是 java 代码。

package com.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
    static Logger loger = LoggerFactory.getLogger(Main.class);
    
    public static void main(String args[]) {
      loger.info(System.getenv("LOGFILE"));
      loger.info("hello");
    }
}
<logger name="com.demo" level="OFF">

上面标签中的 level = "OFF" 覆盖日志级别 - "com.demo"inforoot 级别为 "OFF"

以更简单的方式,当我们向特定记录器声明 level="OFF" 时,记录器级别将在整个应用程序中关闭,并且 appender 无法为其打印日志。

因此,根据我的理解,最好的解决方案是使用如下评论:

案例 1:

<configuration>
  <appender name="STDOUT"
    class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </encoder>
  </appender>

  <appender name="file" class="ch.qos.logback.core.FileAppender">
    <file>logback.log</file>
    <append>true</append>
    <immediateFlush>true</immediateFlush>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </encoder>
  </appender>
  <root level="info">
    <appender-ref ref="file" />
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

在这种情况下,日志将路由到控制台和文件。

案例2:

<configuration>
  <appender name="STDOUT"
    class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </encoder>
  </appender>

  <appender name="file" class="ch.qos.logback.core.FileAppender">
    <file>logback.log</file>
    <append>true</append>
    <immediateFlush>true</immediateFlush>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </encoder>
  </appender>
  <root level="info">
    <!-- <appender-ref ref="file" /> -->
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

在这种情况下,日志将仅路由到控制台,没有日志将路由到文件附加程序。

解法-2:

logback.xml中借助If condition support,我们可以实现它。

<root level="info">
    <appender-ref ref="STDOUT" />
    <if condition='property("FILE_APPENDER_ENABLED").contains("true")'>
        <then>
            <appender-ref ref="file" />
        </then>
    </if>
</root>

environment variables 配置此 属性 FILE_APPENDER_ENABLED,然后可以 enabledisable file appender.

如果此解决方案不适合您,但将来可能对某人有用。