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)-->
        <!-- https://mvnrepository.com/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>
            <version>${log4j.version}</version>
        </dependency>

    </dependencies>

 

 
log4j2.xml
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}_%i.log.gz">
            。。。
        </RollingFile>

        <RollingFile name="ManageWebError" fileName="d:\logs\log4j2study_error.log"
                     filePattern="d:\logs\log4j2study_error_%d{yyyy-MM-dd}_%i.log.gz">
            。。。
        </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 classjava

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= LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
        Logger logger = LogManager.getLogger(/*"study"*/);
        logger.trace("trace level");
        logger.debug("debug level");
        logger.info("info level");
        logger.warn("warn level");
        logger.error("error level");
        logger.fatal("fatal level");

//        Thread.sleep(10);
        throw new Exception("test");
    }
}

 

 

测试spring

以控制台输出为例来进行测试,在上面“CONSOLE”的<Filters>节点定义不一样的ThresholdFilter来测试输出。apache


<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 levelapi


<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
2018-12-28 16:09:43,849 INFO [main] (MyLogTest.java:11) - info levelapp

<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文件的标配)spa

 

总结
a)ThresholdFilter属性:onMatch表示匹配设定的日志级别后是DENY仍是ACCEPT,onMismatch表示不匹配设定的日志级别是DENY仍是ACCEPT仍是NEUTRAL
b)上面说的match/misMatch指的是高于或等于设定的日志级别。因此,要先定义日志级别高的Filter。debug

————————————————————————————

main方法在打印日志的语句后面throw了一个异常。 运行main方法看控制台的输出,会出现异常信息先于log日志输出的状况,可见log4j2是异步记日志的。————————————————————————————须要注意的是,未捕获的异常是不会记日志文件的。————好像是废话~~—————因此,程序必定要捕获异常而且打印出来,不然只能看catelina了————————————————————————————Loggers节点里的Root定义了基本的日志级别与appender的配置关系。若是要自定义关系,可配置Logger节点,设定name属性名(取值一般是class/interface的name),而后在定义Logger对象的实例时,指定这个name便可。

相关文章
相关标签/搜索