zoukankan      html  css  js  c++  java
  • 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:logslog4j2study_info.log"
                         filePattern="d:logslog4j2study_info_%d{yyyy-MM-dd}_%i.log.gz">
                。。。
            </RollingFile>
    
            <RollingFile name="ManageWebError" fileName="d:logslog4j2study_error.log"
                         filePattern="d:logslog4j2study_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 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= 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");
        }
    }

    测试

    以控制台输出为例来进行测试,在上面“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。

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

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

     
     
  • 相关阅读:
    BNUOJ 12756 Social Holidaying(二分匹配)
    HDU 1114 Piggy-Bank(完全背包)
    HDU 2844 Coins (多重背包)
    HDU 2602 Bone Collector(01背包)
    HDU 1171 Big Event in HDU(01背包)
    HDU 2571 命运 (入门dp)
    HDU 1069 Monkey and Banana(最长递减子序列)
    HDU 1160 FatMouse's Speed (最长上升子序列)
    HDU 2594 KMP
    POJ 3783 Balls --扔鸡蛋问题 经典DP
  • 原文地址:https://www.cnblogs.com/buguge/p/10256769.html
Copyright © 2011-2022 走看看