在項目中,可能會產生非常多的日志記錄,為了方便日志分析,一般可以將日志按級別輸出到指定文件,本次就先說說log4j2的實現吧:
1、先加入log4j2依賴包
2、寫一個java類進行測試,類文件中僅僅寫幾行日志:
1 package com.jessezeng.log4j2.test; 2 3 import org.apache.logging.log4j.LogManager; 4 import org.apache.logging.log4j.Logger; 5 6 public class Test { 7 8 private static Logger log=LogManager.getLogger(Test.class); 9 public static void main(String[] args) { 10 log.info("info test..................."); 11 log.error("error test..................."); 12 } 13 }
3、配置log4j2xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- status="OFF",可以去掉,它的含義為是否記錄log4j2本身的event信息,默認是OFF --> 3 <configuration status="OFF"> 4 <!-- 定義下面的引用名 --> 5 <Properties> 6 <property name="log_pattern"> %d %-5p [%c] %m%n</property> 7 <property name="basePath">/logs</property> 8 9 <property name="common-msg">${basePath}/common.log</property> 10 <property name="rollingfile_common-msg">${basePath}/common%d{yyyy-MM-dd}.log</property> 11 12 <property name="error-msg">${basePath}/error.log</property> 13 <property name="rollingfile_error-msg">${basePath}/error%d{yyyy-MM-dd}.log</property> 14 15 </Properties> 16 <!--先定義所有的appender --> 17 <appenders> 18 <!--輸出控制台的配置 --> 19 <Console name="Console" target="SYSTEM_OUT"> 20 <!--控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch) --> 21 <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" /> 22 <!--輸出日志的格式 --> 23 <PatternLayout pattern="${log_pattern}" /> 24 </Console> 25 26 <!--打印出所有的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔 --> 27 <!-- 按月生成歸檔日志,可以使用 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log" --> 28 <RollingFile name="rollingfile_common-msg" 29 filename="${common-msg}" filePattern="${rollingfile_common-msg}" 30 append="true"> 31 <Filters> 32 <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> 33 <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> 34 </Filters> 35 <Policies> 36 <TimeBasedTriggeringPolicy /> 37 </Policies> 38 </RollingFile> 39 40 <RollingFile name="rollingfile_error-msg" 41 filename="${error-msg}" filePattern="${rollingfile_error-msg}" 42 append="true"> 43 <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> 44 <PatternLayout> 45 <Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %class{36} %L %M - %msg%xEx%n</Pattern> 46 </PatternLayout> 47 <Policies> 48 <TimeBasedTriggeringPolicy /> 49 </Policies> 50 </RollingFile> 51 </appenders> 52 <!--然后定義logger,只有定義了logger並引入的appender,appender才會生效 --> 53 <loggers> 54 <AsyncLogger name="net.shgaoxin.log4j2test" level="info" additivity="false" includeLocation="true"> 55 <AppenderRef ref="rollingfile_common-msg" /> 56 <AppenderRef ref="rollingfile_error-msg" /> 57 </AsyncLogger> 58 </loggers> 59 </configuration>
需要注意的是ThresholdFilter的onMatch/onMismatch的三個選項值:ACCEPT/DENY/NEUTRAL,如果有多個ThresholdFilter,那么Filters是必須的,在Filters中,首先要過濾不符合的日志級別,把不需要的首先DENY掉,然后再ACCEPT需要的日志級別,同時也需要注意次序。