是否可以只抑制 Log4j2 中的警告消息,同时允许所有其他消息
Is it possible to suppress only Warn messages in Log4j2 while allowing all others
我正在使用 log4j2 在控制台和文件中记录消息。我收到很多我不想要的警告消息。我只想看到调试和其他消息。是否可以在允许调试、错误和任何其他类型的消息的同时抑制警告消息?
我在这里查看了有关堆栈溢出的其他答案,但它们只讲述了抑制低于该特定消息级别的所有消息的抑制。例如,如果我将我的日志级别更改为错误,我将自动抑制警告调试和低于此级别的任何其他消息。我不想要这种行为。如果可能的话,我想抑制 Only Warn 消息,同时允许低于和高于此级别的任何消息。下面是我的 Log2j2 配置文件。
<Configuration status="error">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n" />
</Console>
<File name="MyFile" fileName="logs/java.log" immediateFlush="false" append="true">
<PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n"/>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console" />
<AppenderRef ref="MyFile"/>
</Root>
</Loggers>
</Configuration>
Try threshold filters as follows:
<Configuration status="error">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<Filters>
<!-- Accept error and fatal messages -->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<!-- Reject Warn messages -->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<!-- This filter accepts debug, trace, info, error, fatal -->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n" />
</Console>
<File name="MyFile" fileName="logs/java.log" immediateFlush="false" append="true">
<Filters>
<!-- Accept error and fatal messages -->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<!-- Reject Warn messages -->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<!-- This filter accepts debug, trace, info, error, fatal -->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n"/>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console" />
<AppenderRef ref="MyFile"/>
</Root>
</Loggers>
</Configuration>
您可以使用 LevelRangeFilter 来拒绝日志事件。
这是生成一些日志的简单 class:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SomeClass {
private static final Logger log = LogManager.getLogger();
public static void main(String[] args){
if(log.isDebugEnabled())
log.debug("This is some debug!");
log.info("Here's some info!");
log.warn("Warning will be rejected.");
log.error("Some error happened!");
}
}
这是一个基本配置,它只将所有事件发送到控制台:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
以上生成的输出是:
21:08:42.215 [main] DEBUG example.SomeClass - This is some debug!
21:08:42.217 [main] INFO example.SomeClass - Here's some info!
21:08:42.217 [main] WARN example.SomeClass - Warning will be rejected.
21:08:42.217 [main] ERROR example.SomeClass - Some error happened!
现在我们将 LevelRangeFilter 添加到控制台附加程序:
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<LevelRangeFilter minLevel="WARN" maxLevel="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
</Console>
现在输出是:
21:15:26.987 [main] DEBUG example.SomeClass - This is some debug!
21:15:26.989 [main] INFO example.SomeClass - Here's some info!
21:15:26.989 [main] ERROR example.SomeClass - Some error happened!
如您所见,警告消息未记录到控制台。
我正在使用 log4j2 在控制台和文件中记录消息。我收到很多我不想要的警告消息。我只想看到调试和其他消息。是否可以在允许调试、错误和任何其他类型的消息的同时抑制警告消息?
我在这里查看了有关堆栈溢出的其他答案,但它们只讲述了抑制低于该特定消息级别的所有消息的抑制。例如,如果我将我的日志级别更改为错误,我将自动抑制警告调试和低于此级别的任何其他消息。我不想要这种行为。如果可能的话,我想抑制 Only Warn 消息,同时允许低于和高于此级别的任何消息。下面是我的 Log2j2 配置文件。
<Configuration status="error">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n" />
</Console>
<File name="MyFile" fileName="logs/java.log" immediateFlush="false" append="true">
<PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n"/>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console" />
<AppenderRef ref="MyFile"/>
</Root>
</Loggers>
</Configuration>
Try threshold filters as follows:
<Configuration status="error">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<Filters>
<!-- Accept error and fatal messages -->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<!-- Reject Warn messages -->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<!-- This filter accepts debug, trace, info, error, fatal -->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n" />
</Console>
<File name="MyFile" fileName="logs/java.log" immediateFlush="false" append="true">
<Filters>
<!-- Accept error and fatal messages -->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<!-- Reject Warn messages -->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<!-- This filter accepts debug, trace, info, error, fatal -->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n"/>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console" />
<AppenderRef ref="MyFile"/>
</Root>
</Loggers>
</Configuration>
您可以使用 LevelRangeFilter 来拒绝日志事件。
这是生成一些日志的简单 class:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SomeClass {
private static final Logger log = LogManager.getLogger();
public static void main(String[] args){
if(log.isDebugEnabled())
log.debug("This is some debug!");
log.info("Here's some info!");
log.warn("Warning will be rejected.");
log.error("Some error happened!");
}
}
这是一个基本配置,它只将所有事件发送到控制台:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
以上生成的输出是:
21:08:42.215 [main] DEBUG example.SomeClass - This is some debug!
21:08:42.217 [main] INFO example.SomeClass - Here's some info!
21:08:42.217 [main] WARN example.SomeClass - Warning will be rejected.
21:08:42.217 [main] ERROR example.SomeClass - Some error happened!
现在我们将 LevelRangeFilter 添加到控制台附加程序:
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<LevelRangeFilter minLevel="WARN" maxLevel="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
</Console>
现在输出是:
21:15:26.987 [main] DEBUG example.SomeClass - This is some debug!
21:15:26.989 [main] INFO example.SomeClass - Here's some info!
21:15:26.989 [main] ERROR example.SomeClass - Some error happened!
如您所见,警告消息未记录到控制台。