<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>
<?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便可。