如何在 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"
的 info
在 root
级别为 "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
,然后可以 enable
或 disable
file appender
.
如果此解决方案不适合您,但将来可能对某人有用。
我正在使用 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"
的 info
在 root
级别为 "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
,然后可以 enable
或 disable
file appender
.
如果此解决方案不适合您,但将来可能对某人有用。