问题
I am using log4j2 to log messages in console and in a file. I am getting a lot of Warn message which I do not want. I only want to see Debug and other messages. is it possible to suppress Warn messages while allowing Debug, Error and any other types of messages?
I have looked at other answers here on stack overflow but they only tell about the suppression that suppresses all of the messages below that specific message level. For example, if I change my log level to Error I will automatically suppress Warn Debug and any other messages that are below this level. I do not want this behavior. I want to suppress Only Warn messages while allowing any messages below and above this level if it is possible. Below is my Log2j2 Config file.
<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>
回答1:
You can use the LevelRangeFilter to reject the log events.
Here's a simple class that generates some logs:
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!");
}
}
Here's a basic configuration that just sends all events to console:
<?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>
The output generated by the above is:
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!
Now we add the LevelRangeFilter to the Console appender:
<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>
Now the output is:
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!
As you can see the WARN message is not logged to console.
回答2:
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>
来源:https://stackoverflow.com/questions/56251542/is-it-possible-to-suppress-only-warn-messages-in-log4j2-while-allowing-all-other