1. 程式人生 > >log4j2配置ThresholdFilter,讓info文件記錄error日誌

log4j2配置ThresholdFilter,讓info文件記錄error日誌

.info 自動 exceptio 設置 方法 acc evel static logger

日誌級別: 是按嚴重(重要)程度來分的(如下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 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即可。

log4j2配置ThresholdFilter,讓info文件記錄error日誌