使用前需要做的准備:
1. 去官方下載log4j2,導入jar包,基本上你只需要導入下面兩個jar包就可以了(xx指的是版本號),也可以使用maven下載,個人覺得maven下載方便些:
log4j-core-xx.jar
log4j-api-xx.jar
2. 導入到你的項目中:這個就不說了。maven下載的就不需要手動導入了。
log4j2的使用:
我們知道,要在某個類中使用log4j記錄日志,只需要申明下面的成員變量(其實不一定要是成員變量,只是為了方便調用而已),log4j2的使用非常簡單,只要用LogManager的getLogger函數獲取一個logger,就可以使用logger記錄日志。在類中加入如下代碼即可:private static Logger logger = LogManager.getLogger(demo_log4j2.class.getName());
這里getLogger有一個參數指定的是這個logger的名稱(demo_log4j2),這個名稱在配置文件里面有需要。聲明了Logger對象,我們就可以在代碼中使用他了。
1 public class demo_log4j2 { 2 private static Logger logger = LogManager.getLogger(demo_log4j2.class.getName()); 3 public static void main(String[] args) { 4 System.out.println(demo_log4j2.class.getName()); //反射機制產生的代碼 5 logger.trace("trace信息"); 6 logger.trace("boss"); 7 logger.debug("debug信息"); 8 logger.info("info信息"); 9 logger.warn("warn信息"); 10 logger.error("error信息"); 11 } 12 13 }
日志的級別
在log4j2中,一共有五種log level,分別為TRACE < DEBUG < INFO < WARN < ERROR < FATAL。
FATAL:用在極端的情形中,即必須馬上獲得注意的情況。這個程度的錯誤通常需要觸發運維工程師的尋呼機。
ERROR:顯示一個錯誤,或一個通用的錯誤情況,但還不至於會將系統掛起。這種程度的錯誤一般會觸發郵件的發送,將消息發送到alert list中,運維人員可以在文檔中記錄這個bug並提交。
WARN:不一定是一個bug,但是有人可能會想要知道這一情況。如果有人在讀log文件,他們通常會希望讀到系統出現的任何警告。
INFO:用於基本的、高層次的診斷信息。在長時間運行的代碼段開始運行及結束運行時應該產生消息,以便知道現在系統在干什么。但是這樣的信息不宜太過頻繁。
DEBUG:用於協助低層次的調試。
TRACE:用於展現程序執行的軌跡。
注意:
級別之間是包含的關系,意思是如果你設置日志級別是trace,則大於等於這個級別的日志都會輸出。
基本上默認的級別沒多大區別,就是一個默認的設定。你可以通過它的API自己定義級別。你也可以隨意調用這些方法,不過你要在配置文件里面好好處理了,否則就起不到日志的作用了,而且也不易讀,相當於一個規范,你要完全定義一套也可以,不用沒多大必要。日志調用
執行上面的demo,會報如下錯誤,且只會打印error、 fatal的信息, 因為沒有配置log4j2的配置文件, 會使用系統默認的配置文件。
ERROR StatusLogger No log4j2 configuration file found. Using default configuration:logging only errors to the console.
若配置了配置文件,可根據自己的配置輸出如下信息,把日志級別設置的是trace:
配置文件
log4j2的配置文件后綴名只能為 .xml, .json或者 .jsn, 在默認的情況, 系統選擇configuration文件的優先級如下:
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該配置文件進行log輸出的配置。 舉例如下:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d [%t] %-5p [%c] - %m%n"/> </Console> </Appenders> <Loggers> <root level="TRACE"> <appender-ref ref="Console" /> </root> </Loggers> </Configuration>

log4j2配置文件介紹以及使用
Configuration根節點
有兩個屬性status和monitorinterval,有兩個子節點:Appenders和Loggers(表明可以定義多個Appender和Logger).
status用來指定log4j本身的打印日志的級別.
monitorinterval用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s
Loggers節點:用於定義logger的level和所采用的appender,它有兩種子節點:Root和Logger.
Root節點:用來指定項目的根日志,如果沒有單獨指定Logger,那么就會默認使用該Root日志輸出
level:日志輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
AppenderRef:Root的子節點,用來指定該日志輸出到哪個Appender,如果沒有指定,就會默認繼承自Root,如果指定了MAME會在指定的這個Appender和Root的Appender中都會輸出,此時我們可以設置Logger的additivity="false",只在自定義的Appender中輸出
Logger節點:用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。
name:用來指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節點.
level:日志輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
其中配置文件日志級別說明如下:
all:最低級的,用於打開所有日志
trace: 是追蹤,就是程序推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關系,我們可以設置最低日志級別不讓他輸出。
debug: 調試么,我一般就只用這個作為最低級別,trace壓根不用。是在沒辦法就用eclipse或者idea的debug功能就好了么。
info: 輸出一下你感興趣的或者重要的信息,這個用的最多了。
warn: 有些信息不是錯誤信息,但是也要給程序員的一些提示,類似於eclipse中代碼的驗證不是有error 和warn(不算錯誤但是也請注意,比如以下depressed的方法)。
error: 錯誤信息。用的也比較多。
fatal: 級別比較高了。重大錯誤,可以直接停止程序了
off:最高級,用於關閉所有日志
備注:程序會打印高於或等於所設置級別的日志,設置的日志等級越高,打印出來的日志就越少。
Appendes節點
輸出目的地.充分考慮了日志事件的輸出、包裝以及過濾轉發的可能,包括最基本的輸出到本地文件、輸出到遠程主機,對文件進行封裝、注入, 並且還能按照日志文件的時間點、文件大小等條件迸行白動封存。它常用的三種子節點:Console,RollingFile、File。
Console節點
用來定義輸出到控制台的Appender
name:指定Appender的名字
target:SYSTEM_OUT或SYSTEM_ERR,一般只設置默認:SYSTEM_OUT。
PatternLayout:輸出格式,不設置默認為:%m%n
File節點
用來定義輸出到指定位置的文件的Appender
name:指定Appender的名字
FileName:指定輸出日志的目的文件帶全路徑的文件名
PatternLayout:輸出格式,不設置默認為:%m%n
RollingFile節點
用來定義超過指定大小白動刪除舊的創建新的Appender
name:指定Appender的名字
FileName:指定輸出日志的目的文件帶全路徑的文件名
PatternLayout:輸出格式,不設置默認為:%m%n
FilePattern:指定新建日志文件的名稱格式
Policies:指定滾動日志的策略,就是什么時候進行新建日志文件輸出日志
TimeBasedTriggeringPolicy:Policies子節點,基於時間的滾動策略,interval屬性用來指定多久滾動依次,默認1hour。modulate=true用來調整時間,比如現在是下午七點,interval是4,name第一次滾動是在下午八點,接着是凌晨十二點,午夜四點,而不是一開始就是十一點。
SizeBasedTriggeringPolicy:Policies子節點,基於指定文件大小的滾動策略,size屬性用來定義每個日志文件的大小
DefaultRolloverStrategy:用來指定同一個文件夾下最多有幾個日志文件時開始刪除最舊的,創建新的日志文件,通過max屬性。不設置max屬性,是默認7個文件
PatternLayout是日志文件的布局格式
常用的參數如下:
%d:打印時間,常用設置:{HH:mm:ss.SSS} {yyyy-MM-dd 'at' HH:mm:ss z}等
%class/%c:打印輸出日志的類名,常用設置{36} 表示層數
%level:打印日志級別 ,常用設置%-5level 表示日志的級別長度小於5,則右邊用空格填充 ;%5level 相反。
%L:打印日志輸出語句在文件中的行號。
%M:打印日志輸出語句所在的方法名。
%t:當前生成日志事件的線程。
%m/%msg/%message:輸出日志事件所提供的信息。
說了這么多,貼個詳細的配置信息:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--日志級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> 3 <!--Configuration后面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出--> 4 <!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數--> 5 <configuration status="WARN" monitorInterval="30"> 6 <!--先定義所有的appender--> 7 <appenders> 8 <!--這個輸出控制台的配置--> 9 <console name="Console" target="SYSTEM_OUT"> 10 <!--輸出日志的格式--> 11 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> 12 </console> 13 <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定(false),這個也挺有用的,適合臨時測試用--> 14 <File name="log" fileName="logs/data.log" append="true"> 15 <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> 16 </File> 17 <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔--> 18 <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log" 19 filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"> 20 <!--控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--> 21 <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> 22 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> 23 <Policies> 24 <TimeBasedTriggeringPolicy/> 25 <SizeBasedTriggeringPolicy size="10 KB"/> 26 </Policies> 27 </RollingFile> 28 <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log" 29 filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"> 30 <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> 31 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> 32 <Policies> 33 <TimeBasedTriggeringPolicy/> 34 <SizeBasedTriggeringPolicy size="100 MB"/> 35 </Policies> 36 <!--DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20--> 37 <DefaultRolloverStrategy max="20"/> 38 </RollingFile> 39 <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log" 40 filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"> 41 <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> 42 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> 43 <Policies> 44 <TimeBasedTriggeringPolicy/> 45 <SizeBasedTriggeringPolicy size="100 MB"/> 46 </Policies> 47 </RollingFile> 48 </appenders> 49 <!--然后定義logger,只有定義了logger並引入的appender,appender才會生效--> 50 <loggers> 51 <!--過濾掉spring和mybatis的一些無用的DEBUG信息--> 52 <logger name="org.springframework" level="INFO"></logger> 53 <logger name="org.mybatis" level="INFO"></logger> 54 <Logger name="com.selenium.log4j2.demo_log4j2" level="trace"> <!-- additivity="false" --> 55 <appender-ref ref="log" /> 56 </Logger> 57 <root level="all"> 58 <appender-ref ref="Console"/> 59 <appender-ref ref="RollingFileInfo"/> 60 <appender-ref ref="RollingFileWarn"/> 61 <appender-ref ref="RollingFileError"/> 62 </root> 63 </loggers> 64 </configuration>
執行日志文件超過多大而重新新建日志文件結果如下: