【问题标题】:How to disable logger in logback.xml如何在 logback.xml 中禁用记录器
【发布时间】:2021-11-13 10:29:23
【问题描述】:

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

以下是我的配置,其中两个附加程序 STDOUT 和文件都添加了根目录。 我想要控制文件附加程序日志,并且当我将 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");
    }
}

【问题讨论】:

  • 没有什么叫 SNSMain,Main 是记录器引用的类的名称。

标签: java logback


【解决方案1】:
<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

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

【讨论】:

  • 嗨 Arun,我用这一行替换了条件 并且您可以看到打印记录它的 env 变量的值美好的。控制台工作正常,但文件附加程序不工作。
  • 请在问题中添加更新后的 logback.xml,想看看你是如何将环境变量注入到 logack.xml 中的
  • 我没有在 logback.xml 中添加任何内容,并且认为新行本身会拉取 env var 并对其进行比较。看起来不是这样,需要在 logback.xml 中添加一些内容。你能帮我添加那行吗? :)
  • 嗨,它现在可以工作了,是 eclipse 没有填充 env var。我已经重启了。
  • 很高兴听到它的工作原理!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
相关资源
最近更新 更多