一、背景
log4j2.xml本身已經接觸了很久了,但都屬於一知半解,最近在做aws uploading files的temporary credentials, 有一個debug leval 的日志,雖然不影響最后的使用,但是在日志文件里非常的難看,所以想通過log4j2的配置,隱藏掉這條日志文件,加上項目本身不是很忙,干脆就好好總結一下。
二、關於配置文件的名稱以及在項目中的存放位置以及日志的leval
log4j 2.x版本不再支持像1.x中的.properties后綴的文件配置方式,2.x版本配置文件后綴名只能為".xml",".json"或者".jsn".
系統選擇配置文件的優先級(從先到后)如下:
(1).classpath下的名為log4j2-test.json 或者log4j2-test.jsn的文件.
(2).classpath下的名為log4j2-test.xml的文件.
(3).classpath下名為log4j2.json 或者log4j2.jsn的文件.
(4).classpath下名為log4j2.xml的文件.
我們一般默認使用log4j2.xml進行命名。如果本地要測試,可以把log4j2-test.xml放到classpath,而正式環境使用log4j2.xml,則在打包部署的時候不要打包log4j2-test.xml即可。
trace<debug<info<warn<error<fatal
三、缺省默認配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <Configuration status="WARN"> 3 <Appenders> 4 <Console name="Console" target="SYSTEM_OUT"> 5 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 6 </Console> 7 </Appenders> 8 <Loggers> 9 <Root level="error"> 10 <AppenderRef ref="Console"/> 11 </Root> 12 </Loggers> 13 </Configuration>
- 根節點Configuration有兩個屬性:status和monitorinterval,有兩個子節點:Appenders和Loggers(表明可以定義多個Appender和Logger).
status用來指定log4j本身的打印日志的級別.
monitorinterval用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s.
- Appenders節點,常見的有四種子節點:Console、RollingFile、File、Socket.
Console節點用來定義輸出到控制台的Appender.
name:指定Appender的名字.
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只設置默認:SYSTEM_OUT.
PatternLayout:輸出格式,不設置默認為:%m%n.
File節點用來定義輸出到指定位置的文件的Appender.
name:指定Appender的名字.
fileName:指定輸出日志的目的文件帶全路徑的文件名.
PatternLayout:日志的輸出格式,不設置默認為:%m%n.
RollingFile節點用來定義超過指定大小自動歸檔(rolling)舊的創建新的的Appender.
name:指定Appender的名字.
fileName:指定輸出日志的目的文件帶全路徑的文件名.
PatternLayout:日志的輸出格式,不設置默認為:%m%n.
filePattern:指定歸檔日志文件的名稱格式.
Policies:指定滾動日志的策略,就是什么時候進行新建日志文件輸出日志.
TimeBasedTriggeringPolicy:Policies子節點,基於時間的滾動策略,interval屬性用來指定多久滾動一次,默認是1 hour。modulate=true用來調整時間:比如現在是早上3am,interval是4,那么第一次滾動是在4am,接着是8am,12am...而不是7am.
SizeBasedTriggeringPolicy:Policies子節點,基於指定文件大小的滾動策略,size屬性用來定義每個日志文件的大小.
DefaultRolloverStrategy:用來指定同一個文件夾下最多有幾個日志文件時開始刪除最舊的,創建新的(通過max屬性)。
Filter: 日志過濾,如:<ThresholdFilter level="DEBUG"/>,表示debug級別以上的log會被打印。
Socket節點用來定義將日志輸出至別的服務器上,如:
<Socket name="server" host="10.140.254.54" port="12345" protocol="UDP"> <PatternLayout pattern="%d{MMM dd HH:mm:ss.SSS} %-5p %X{HostName} PRISM %X{AccountID}/%X{ApplicationID}/%X{SessionGUID}/%X{SessionNumber}/1/[%X{CallID}] [%t] %m%n" /> </Socket>
3. loggers節點
logger表明,對某一文件,只有高於某級別,才被打印
AppenderRef:Logger的子節點,用來指定該日志輸出到哪個Appender,如果沒有指定,就會默認繼承自Root.如果指定了,那么會在指定的這個Appender和Root的Appender中都會輸出,此時我們可以設置Logger的additivity="false"只在自定義的Appender中進行輸出。
4、比較完整的log4j2.xml配置模板
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!--日志級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> 4 5 <!--Configuration后面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出--> 6 7 <!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數--> 8 9 <configuration status="WARN" monitorInterval="30"> 10 11 <!--先定義所有的appender--> 12 13 <appenders> 14 15 <!--這個輸出控制台的配置--> 16 17 <console name="Console" target="SYSTEM_OUT"> 18 19 <!--輸出日志的格式--> 20 21 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> 22 23 </console> 24 25 <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用--> 26 27 <File name="log" fileName="log/test.log" append="false"> 28 29 <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> 30 31 </File> 32 33 <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔--> 34 35 <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log" 36 37 filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"> 38 39 <!--控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--> 40 41 <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> 42 43 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> 44 45 <Policies> 46 47 <TimeBasedTriggeringPolicy/> 48 49 <SizeBasedTriggeringPolicy size="100 MB"/> 50 51 </Policies> 52 53 </RollingFile> 54 55 <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log" 56 57 filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"> 58 59 <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> 60 61 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> 62 63 <Policies> 64 65 <TimeBasedTriggeringPolicy/> 66 67 <SizeBasedTriggeringPolicy size="100 MB"/> 68 69 </Policies> 70 71 <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20 --> 72 73 <DefaultRolloverStrategy max="20"/> 74 75 </RollingFile> 76 77 <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log" 78 79 filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"> 80 81 <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> 82 83 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> 84 85 <Policies> 86 87 <TimeBasedTriggeringPolicy/> 88 89 <SizeBasedTriggeringPolicy size="100 MB"/> 90 91 </Policies> 92 93 </RollingFile> 94 95 </appenders> 96 97 <!--然后定義logger,只有定義了logger並引入的appender,appender才會生效--> 98 99 <loggers> 100 101 <!--過濾掉spring和mybatis的一些無用的DEBUG信息--> 102 103 <logger name="org.springframework" level="INFO"></logger> 104 105 <logger name="org.mybatis" level="INFO"></logger> 106 107 <root level="all"> 其他logger輸出所有的日志信息 108 109 <appender-ref ref="Console"/> 110 111 <appender-ref ref="RollingFileInfo"/> 112 113 <appender-ref ref="RollingFileWarn"/> 114 115 <appender-ref ref="RollingFileError"/> 116 117 </root> 118 119 </loggers> 120 121 </configuration>
5、用戶自定義級別日志CustomLevels
這也是在項目里經常用到的,
1 <CustomLevels> 2 <CustomLevel name="USER" intLevel="350" /> 3 </CustomLevels>
Standard Level | intLevel |
---|---|
OFF | 0 |
FATAL | 100 |
ERROR | 200 |
WARN | 300 |
INFO | 400 |
DEBUG | 500 |
TRACE | 600 |
ALL | Integer.MAX_VALUE |