Log4j最清楚簡單的入門使用教程
自從寫javaEE應用開始,就一直在列印日誌時飽受麻煩、亂等缺點的折磨,時常感嘆命運的不公,為什麼不像android移動端開發時的logd列印日誌那麼好用呢?logd又能給日誌劃分等級,又能有便捷的日誌搜尋功能,難道javaEE發展了這麼多年,還只能像遠古時代一樣使用System.out.println()去手動列印日誌,再去手動獲取時間打印出來嗎?
當然不是!
為何要列印日誌?
首先,我們必須明白程式日誌的重要性,我們在玩一些遊戲的時候,如果遊戲發生了異常,在閃退的時候經常會彈出一個提示框:“是否向我們傳送遊戲錯誤日誌來協助我們更好地改進遊戲”,這時,如果我們點選確定,就會將我們的程式執行日誌傳送到開發商手中,協助它們修改bug。但是假如我們沒有日誌功能,那麼我們玩遊戲閃退就是閃退了,沒有任何提示,開發商也沒法修復bug,那麼恐怕這家開發商就離倒閉不遠了。
知道了日誌的重要性,那麼我們應該在程式執行時輸出多少日誌才算是合格呢?答案是幾乎每一個方法的傳入引數,返回值還有一些重要的物件、變數都要在執行時打印出來它們的值,還要配合一些中文漢字對其進行解釋。對於網際網路公司來說,公司內部所佔儲存空間最大的應該非日誌莫屬了。試想,莫一天黑客盜刷了你的支付寶什麼的,你需要去找阿里巴巴申訴希望能把錢要回來,那麼你被盜刷的唯一證據就是程式日誌了。日誌在平時不怎麼起眼,但是在程式除錯和還原資料的時候能起的作用那可是大大的。
使用Log4j
不同於我們列印日誌的時候只能使用System.out.print()這種土辦法,log4j做到了為我們的日誌分級,還有一些更好用的功能,具體的東西后面再說,我們先把log4j跑起來再說。
找了網上很多教程,發現要不就是直接翻譯文件,要不就是說的不太全,要不就是太高大上了,對新手不太友好。這裡我保證,按照我下面的步驟來,絕對可以把log4j跑起來,並且跑起來之後,完全已經可以用於開發了。當然,只是入門的用法,一些進階用法請自行學習,本篇部落格面向新手,因為本人也比較菜,見諒。
1.下載安裝
下載安裝有兩種方式:
-
下載安裝jar包
https://www-eu.apache.org/dist/logging/log4j/2.11.1/apache-log4j-2.11.1-bin.zip
下載完成後直接拖進bin目錄下即可 -
使用maven等下載
如果你是maven專案,那就簡單了,直接在pom.xml中貼上以下依賴,然後儲存,等待下載完成即可:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.1</version> </dependency>
2.使用
接下來,我們新建一個類,在裡面使用log4j列印一句話來證明我們會用了:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
public static final Logger logger = LogManager.getLogger(Test.class);//獲取日誌列印物件
public static void main(String[] args) {
logger.debug("Hello World!");//列印除錯日誌
}
}
解釋一下,獲取日誌列印物件的那一行相當於我們取得了一個印表機,而列印日誌的那一行是我們用這臺印表機打印出來了日誌。什麼是debug日誌呢?log4j也把日誌分為了幾個等級,從低階到高階分別為:
- ALL:表示輸出所有
- trace: 追蹤日誌,就是程式執行推進一步,你就可以寫個trace日誌,所以trace可能會特別多。
- debug: 除錯日誌,本人一般就只用這個作為最低級別的日誌,trace壓根不用,當然這是習慣問題,還是按照規範來比較好。
- info: 資訊日誌,輸出一下重要的資訊。
- warn: 警告日誌,有些資訊不是錯誤資訊,但是有可能有隱患或者不規範,要給程式設計師一些提示。
- error: 錯誤資訊日誌,當程式執行到哪一步出現了執行錯誤或者異常時使用。
- fatal: 致命錯誤資訊日誌,表示重大錯誤,這種級別你可以直接中斷程式運行了。
- OFF:表示不輸出任何日誌
上面的程式碼我們就是列印了一段除錯日誌,說完了這幾行程式碼的意思,我們來執行一下試試看:
執行結果:
ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
咦?報錯了,沒能輸出任何日誌,這是為什麼呢?
我們翻譯這段錯誤資訊,它說的是沒有找到Log4j配置檔案,讓我們使用預設的配置檔案(這樣只能在控制檯輸出日誌)或者使用使用者建立的配置檔案。
那麼解決方法很簡單,我們給它建一個配置檔案好了:
我們在src目錄下main資料夾中的resource資料夾下新建一個log4j2.xml,內容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
這相當於是log4j的預設配置,別忘了儲存。
好了,配置檔案有了,現在讓我們再去試試剛才的程式碼,這次執行之後什麼反應也沒有了,開啟控制檯,我們發現並沒有輸出任何資訊,這是為什麼呢?
log4j預設的是按等級顯示日誌,只會顯示大於等於配置檔案中設定的等級的日誌,比如現在,我們這句話:
<Root level="error">
設定的就是隻顯示大於等於error等級的日誌,也就是現在只顯示error和fatal日誌,不信我們來試試,多來幾句:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
public static final Logger logger = LogManager.getLogger(Test.class);
public static void main(String[] args) {
logger.debug("Hello World!");
logger.error("Hello World!");
logger.warn("aaa");
}
}
執行結果:
可以看到,只有error日誌被輸出了
那麼我們只要更改這個等級,就可以輸出不同等級的日誌出來了:
改為debug等級:
<Root level="debug">
輸出結果:
可以看到,這樣我們的三句日誌就都輸出來了
3. 配置檔案解析:
下面我們直接上一個活生生的配置檔案例子來講解一下我們的log4j2.xml配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<!-- 先定義所有的appender,appender相當於是各種各樣的印表機配置,有向控制檯列印的印表機,有向檔案中列印的印表機等等 -->
<appenders>
<!-- 這個是輸出到控制檯的印表機配置 -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 控制檯只輸出level及以上級別的資訊(onMatch="ACCEPT"),其他的直接拒絕(onMismatch="DENY") -->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 這個是日誌的格式 -->
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<!-- 這個是輸入進檔案儲存下來的印表機配置,這個印表機每次執行時之前儲存的日誌檔案自動清空,由append屬性決定,這個適合臨時測試用 -->
<!-- append為TRUE表示日誌增加到指定檔案中,false表示日誌覆蓋指定的檔案內容,預設值是true -->
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 新增過濾器ThresholdFilter,可以有選擇的輸出某個級別以上的類別 onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否則直接拒絕 -->
<File name="ERROR" fileName="logs/error.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 這個印表機會打印出所有的資訊,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的資料夾下面並進行壓縮,作為存檔 -->
<RollingFile name="RollingFile" fileName="logs/web.log"
filePattern="logs/$${date:yyyy-MM}/web-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="2MB"/>
</RollingFile>
</appenders>
<!-- 然後定義logger,只有定義了logger並引入剛才的appender配置,appender才會生效 -->
<loggers>
<!-- 建立一個預設的root的logger -->
<root level="trace">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
<appender-ref ref="ERROR" />
<appender-ref ref="log"/>
</root>
</loggers>
</configuration>
到此,我們的springMVC配置log4j就完成了,接下來你要做的就是看懂我們剛剛的log4j.xml配置檔案中的註釋,然後嘗試去自定義日誌格式,日誌儲存位置等一系列自定義配置了。