1. 程式人生 > >Log4j最清楚簡單的入門使用教程

Log4j最清楚簡單的入門使用教程

自從寫javaEE應用開始,就一直在列印日誌時飽受麻煩、亂等缺點的折磨,時常感嘆命運的不公,為什麼不像android移動端開發時的logd列印日誌那麼好用呢?logd又能給日誌劃分等級,又能有便捷的日誌搜尋功能,難道javaEE發展了這麼多年,還只能像遠古時代一樣使用System.out.println()去手動列印日誌,再去手動獲取時間打印出來嗎?

當然不是!

為何要列印日誌?

首先,我們必須明白程式日誌的重要性,我們在玩一些遊戲的時候,如果遊戲發生了異常,在閃退的時候經常會彈出一個提示框:“是否向我們傳送遊戲錯誤日誌來協助我們更好地改進遊戲”,這時,如果我們點選確定,就會將我們的程式執行日誌傳送到開發商手中,協助它們修改bug。但是假如我們沒有日誌功能,那麼我們玩遊戲閃退就是閃退了,沒有任何提示,開發商也沒法修復bug,那麼恐怕這家開發商就離倒閉不遠了。

知道了日誌的重要性,那麼我們應該在程式執行時輸出多少日誌才算是合格呢?答案是幾乎每一個方法的傳入引數,返回值還有一些重要的物件、變數都要在執行時打印出來它們的值,還要配合一些中文漢字對其進行解釋。對於網際網路公司來說,公司內部所佔儲存空間最大的應該非日誌莫屬了。試想,莫一天黑客盜刷了你的支付寶什麼的,你需要去找阿里巴巴申訴希望能把錢要回來,那麼你被盜刷的唯一證據就是程式日誌了。日誌在平時不怎麼起眼,但是在程式除錯和還原資料的時候能起的作用那可是大大的。

使用Log4j

不同於我們列印日誌的時候只能使用System.out.print()這種土辦法,log4j做到了為我們的日誌分級,還有一些更好用的功能,具體的東西后面再說,我們先把log4j跑起來再說。
找了網上很多教程,發現要不就是直接翻譯文件,要不就是說的不太全,要不就是太高大上了,對新手不太友好。這裡我保證,按照我下面的步驟來,絕對可以把log4j跑起來,並且跑起來之後,完全已經可以用於開發了。當然,只是入門的用法,一些進階用法請自行學習,本篇部落格面向新手,因為本人也比較菜,見諒。

1.下載安裝

下載安裝有兩種方式:

  1. 下載安裝jar包
    https://www-eu.apache.org/dist/logging/log4j/2.11.1/apache-log4j-2.11.1-bin.zip
    下載完成後直接拖進bin目錄下即可

  2. 使用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也把日誌分為了幾個等級,從低階到高階分別為:

  1. ALL:表示輸出所有
  2. trace: 追蹤日誌,就是程式執行推進一步,你就可以寫個trace日誌,所以trace可能會特別多。
  3. debug: 除錯日誌,本人一般就只用這個作為最低級別的日誌,trace壓根不用,當然這是習慣問題,還是按照規範來比較好。
  4. info: 資訊日誌,輸出一下重要的資訊。
  5. warn: 警告日誌,有些資訊不是錯誤資訊,但是有可能有隱患或者不規範,要給程式設計師一些提示。
  6. error: 錯誤資訊日誌,當程式執行到哪一步出現了執行錯誤或者異常時使用。
  7. fatal: 致命錯誤資訊日誌,表示重大錯誤,這種級別你可以直接中斷程式運行了。
  8. 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配置檔案中的註釋,然後嘗試去自定義日誌格式,日誌儲存位置等一系列自定義配置了。