log4j2配置ThresholdFilter,让info⽂件记录error⽇志
⽇志级别:
是按严重(重要)程度来分的(如下6种):
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
打印⽇志的规则:
levelP>=levelQ,则levelP会打印在levelQ的log⾥。
即:如果设置的⽇志级别是info,则会包括info、warn、error等⾼级别的⽇志
如下demo以打印到控制台来做测试。
log4j2依赖
<properties>
<log4j.version>2.5</log4j.version>
</properties>
<dependencies>
<!--引⼊log4j2必要的依赖(log4j-api、log4j-core)-->
<!-- mvnrepository/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
log4j2不打印日志<version>${log4j.version}</version>
</dependency>
</dependencies>
springcontext⽂件不需要引⼊log4j⽂件。log4j框架会⾃动检测该⽂件。
下⾯log4j2配置Root的level是info。所以,默认在不设置Filter时,会打印INFO WARN ERROR FATAL级别的⽇志。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<!-- 控制台打印 -->
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p [%t] (%F:%L) - %m%n"/>
<Filters>
~~~
</Filters>
</Console>
<!-- 按天每天备份⼀个⽇志 -->
<RollingFile name="ManageWebInfo" fileName="d:\logs\log4j2study_info.log"
filePattern="d:\logs\log4j2study_info_%d{yyyy-MM-dd}_%">
。。。
</RollingFile>
<RollingFile name="ManageWebError" fileName="d:\logs\log4j2study_error.log"
filePattern="d:\logs\log4j2study_error_%d{yyyy-MM-dd}_%">
。。。
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="CONSOLE"/>
<AppenderRef ref="ManageWebInfo"/>
<AppenderRef ref="ManageWebError"/>
</Root>
<Logger name="study" level="WARN">
<AppenderRef ref="CONSOLE"/>
</Logger>
</Loggers>
</Configuration>
test class
package study;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4j2Test {
public static void main(String[] args) throws Exception {
/
/ Logger logger= Logger(LogManager.ROOT_LOGGER_NAME);
Logger logger = Logger(/*"study"*/);
logger.debug("debug level");
logger.info("info level");
logger.warn("warn level");
<("error level");
logger.fatal("fatal level");
// Thread.sleep(10);
throw new Exception("test");
}
}
测试
以控制台输出为例来进⾏测试,在上⾯“CONSOLE”的<Filters>节点定义不同的ThresholdFilter来测试输出。
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
2018-12-28 16:07:44,477 INFO [main] (MyLogTest.java:11) - info level
2018-12-28 16:07:44,479 WARN [main] (MyLogTest.java:12) - warn level
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
2018-12-28 16:09:43,849 INFO [main] (MyLogTest.java:11) - info level
<ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
⾼于INFO的都不打印,因为root⽇志级别是info,所以就不会打印任何⽇志了。
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
只打印INFO和ERROR
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
只打印ERROR及以上(即ERROR和FATAL)(error.log⽂件的标配)
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="ACCEPT"/>
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>(Filters节点⾥只有这⼀个Filter时)
打印INFO、WARN、ERROR(常见的info.log⽂件的标配)
总结
a)ThresholdFilter属性:onMatch表⽰匹配设定的⽇志级别后是DENY还是ACCEPT,onMismatch表⽰不匹配设定的⽇志级别是DENY还是ACCEPT还是NEUTRAL
b)上⾯说的match/misMatch指的是⾼于或等于设定的⽇志级别。所以,要先定义⽇志级别⾼的Filter。
onMatch和onMismatch都有三个属性值,分别为Accept、DENY和NEUTRAL
介绍⼀下这两个配置项的三个属性值:
onMatch="ACCEPT" 表⽰匹配该级别及以上
onMatch="DENY" 表⽰不匹配该级别及以上
onMatch="NEUTRAL" 表⽰该级别及以上的,由下⼀个filter处理,如果当前是最后⼀个,则表⽰匹配该级别及以上
onMismatch="ACCEPT" 表⽰匹配该级别以下
onMismatch="NEUTRAL" 表⽰该级别及以下的,由下⼀个filter处理,如果当前是最后⼀个,则不匹配该级别以下的
onMismatch="DENY" 表⽰不匹配该级别以下的
————————————————————————————
main⽅法在打印⽇志的语句后⾯throw了⼀个异常。运⾏main⽅法看控制台的输出,会出现异常信息先于log⽇志输出的情况,可见log4j2是异步记⽇志的。
————————————————————————————
需要注意的是,未捕获的异常是不会记⽇志⽂件的。————好像是废话~~—————所以,程序⼀定要捕获异常并且打印出来,否则只能看catalina.out(tomcat容器下的应⽤)了
————————————————————————————
Loggers节点⾥的Root定义了基本的⽇志级别与appender的配置关系。如果要⾃定义关系,可配置Logger节点,设定name属性名(取值通常是class/interface的name),然后在定义Logger对象的实例时,指定这个name即可。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论