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即可。

     
     
  • 相关阅读:
    译:编程面试的10大算法概念汇总
    Android内存优化之封装九宫格
    Android Java 程序员必备开发工具
    译:如何成为一个通晓多种编程语言的程序员
    8大排序算法图文讲解
    Android酷炫实用的开源框架(UI框架)
    Android动态加载字节码
    利用无效字节码指令引发逆向工具崩溃(二)
    oracle 12c linux服务器启动监听
    oracle无主键去重方法
  • 原文地址:https://www.cnblogs.com/buguge/p/10256769.html
Copyright © 2011-2022 走看看