简体   繁体   English

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

[英]How to disable logger in logback.xml

I am using logback.xml file to set logging env.我正在使用 logback.xml 文件来设置日志记录环境。 Here I have 2 appenders one for console another for file.在这里,我有 2 个 appender,一个用于控制台,另一个用于文件。 Console appender will always print the value but the file appender needs to open when required.控制台附加程序将始终打印该值,但文件附加程序需要在需要时打开。

Following is my configuration, in which two appender STDOUT and file and both are added root.以下是我的配置,其中两个appender STDOUT 和file 都添加了root。 What I want to control file appender log and want when I change the value of level from OFF to something else then only it should work.当我将 level 的值从 OFF 更改为其他值时,我想要控制文件追加器日志和想要的东西,那么它应该可以工作。 Currently if change level OFF then stop both appender and not able to see anything on console.目前,如果更改级别为 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>

Following is the java code.下面是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">

This level = "OFF" in the above tag overrides the log level - info of "com.demo" at root level to "OFF"上面标签中的这个level = "OFF"会覆盖日志级别 - root级别的"com.demo" info"OFF"

In a simpler way the moment we declare the level="OFF" to a particular logger, the logger level will be OFF in the whole application and no appender can print the logs for it.以一种更简单的方式,当我们向特定记录器声明level="OFF" ,记录器级别将在整个应用程序中关闭,并且没有appender可以为其打印日志。

Hence as per my understanding, the best solution would be to use commenting like below:因此,根据我的理解,最好的解决方案是使用如下评论:

case1:情况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>

In this case- the log will route to both console and file.在这种情况下 - 日志将路由到控制台和文件。

case2:案例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>

In this case- the log will be routed to only the console and no log will be routed to the file appender.在这种情况下 - 日志将仅路由到控制台,而不会将日志路由到文件附加程序。

Solution-2:解决方案 2:

By taking help of If condition support in logback.xml , we can achieve it.借助logback.xmlIf 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>

Configure this property FILE_APPENDER_ENABLED from environment variables , then could enable or disable the file appender .environment variables配置此属性FILE_APPENDER_ENABLED ,然后可以enabledisable file appender

May be if this solution not suitable to you, but in future it might be useful to someone.可能是这个解决方案不适合你,但将来它可能对某人有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM