聊聊log4j的由來和在Spring MVC的使用

本篇聊聊在Java界著名的log4j,Apache爲什麼要開發log4j?log4j與Java的關係是什麼?log4j爲什麼需要配置文件,這些問題本文都會給出答案

log4j是怎麼來的?

沒接觸過log4j的Java開發者,看到log4j這個名字,估計會腦袋發矇,這是啥玩意呢?log4j是Apache爲Java開發者提供的日誌工具,解釋一下就是log for java,給Java程序提供日誌輸出的工具。

 image.png                                          

問題又來了,Apache爲什麼要開發log4j呢?因爲Apache開發log4j是爲了補Java的短板。Java在設計之初,充分借鑑了C等其它編程語言的優點,其語言的簡潔性、易使用性以及跨平臺性都非常不錯,唯獨沒有設計日誌系統。這可苦了早期Java開發者了,當寫完的程序運行後,若發行程序的運行結果和預期的不一樣,開發者要發現程序所存在的問題,只能採用調試的方式逐一排查,費時費力。若程序已提交給客戶,在客戶環境下出現了問題,是無法進行調試排查的,只能寄希望於問題在開發環境中重現。

難以發現程序運行中出現的問題,是早期Java的一個短板,爲了解決這個短板。Apache開發了log4j,log4j可以把程序運行過程中的重要信息輸出到文件中,這些重要信息的輸出是由Java開發者來確定的,也就是說開發者在開發程序時,會把一些可能出現問題的變量、執行的語句狀態、重要的節點信息寫到文件中,當程序在運行過程中出現問題時,就可以從這些文件中跟蹤程序的運行信息,及時發現程序存在的問題,寫入程序運行信息的文件被稱爲系統日誌,log4j就是用來寫系統日誌的程序。

從哪兒下載log4j?

log4j對程序的監控和問題排查確實很有用,對沒有使用log4j的開發者來說,如何使用它呢?

image.png

 

 

等等,log4j怎麼變成log4j2了呢?log4j2是log4j的升級版,功能上自然比log4j要強大了很多。再說,Apache已經停止對log4j的更新了,我們自然要用log4j2了。下載的壓縮包裏面有三個重要的文件,把這三個文件複製到項目WEB-INF目錄下的lib目錄。

image.png

萬事具備,只欠東風

現在萬事具備,只欠東風。東風就是log4j2.xml配置文件,log4j會讀取這個配置文件。log4j爲什麼需要這個配置文件呢?因爲log4j可以把更多的日誌輸出控制權交給開發者。舉個例子,如果沒有配置文件,log4j會把日誌輸出到一個固定的位置,你沒有任何辦法想讓它把日誌文件輸出到你指定的位置;再來一個例子,假如你想自己定義輸出的日誌格式,沒有配置文件,你無能爲力。

下面是一個簡單配置文件的內容。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?xml version="1.0" encoding="UTF-8"?>

<configuration status="WARN">

    <appenders>

        <Console name="Console" target="SYSTEM_OUT">

            <PatternLayout

                    pattern="%d{DEFAULT} [%t] %-5p %c{36} - %m%n"/>

        </Console>

    </appenders>

    <loggers>

        <root level="info">

            <appender-ref ref="Console" />

        </root>

    </loggers>

</configuration>

配置文件中的appenders標籤是用來定義日誌輸出位置的,在這個標籤下輸出位置可以定義多個,每個位置由子標籤來定義。如上面配置文件的Console標籤定義了日誌信息輸出到控制檯。Console標籤下的PatternLayout標籤定義了日誌的輸出格式,標籤的pattern屬性用來配置日誌輸出的格式,在這裏你可以更改爲自己喜歡的輸出格式,至於具體怎麼改,網上一大堆,這裏就不細說了,不過一般來說保持默認的輸出格式就可以了。

配置文件中的loggers標籤用來定義日誌輸出範圍,對日誌信息進行級別限制,在log4j中根據輸出日誌信息的重要程度,將日誌主要分爲六個級別,按重要程度排序爲fatal(致命)、error(錯誤)、warn(警告)、info(信息)、debug(調試)、trace(追蹤)。其中,最常用的是error和info,當程序能夠自己捕捉到錯誤,但錯誤不影響系統運行時,用error輸出錯誤和異常信息;在程序運行過程中,特別是在客戶環境下運行時,可以輸出一些程序的重要信息,用於發現程序的潛在問題,這是可以用info輸出信息。

loggers標籤下的root標籤中level屬性可以限制日誌的輸出級別,當level屬性設置爲info級別時,log4j只輸出info級別以上的日誌,即使你在程序中輸出了低於info級別的日誌,log4j也不會讓這些日誌信息輸出。

需要注意的是,log4j2.xml配置文件創建完成後,需要把log4j2.xml配置文件存儲到WEB項目的WEB-INF根目錄下。

使用log4j跟蹤程序

前面都是鋪墊,現在要開始真正幹活了。還是以Mooc項目爲案例,Mooc項目的工程文件和源代碼可以從碼雲上下載。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

@Controller

@RequestMapping("/user")

public class RegisterController {

  

/*聲明log4j對象*/

Logger  log = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

@Autowired

private RegisterService regService;

  

@RequestMapping(value = "/register.do", method = { RequestMethod.GET, RequestMethod.POST })

public ModelAndView registerUser(HttpServletRequest request) throws UnsupportedEncodingException {

    

    /*設置前端字符編碼爲UTF-8*/

    request.setCharacterEncoding("UTF-8");

    /* 創建返回的ModelAndView實例 */

    ModelAndView view = new ModelAndView();

    /* 從發送請求的JSP頁面獲取表單數據 */

    String paraLogin = request.getParameter("login");

    String paraName = request.getParameter("name");

    String paraPsw = request.getParameter("psw");

  

    /*輸出日誌信息*/

    log.info(paraLogin);

    log.error(paraPsw);

  

    /* 實例化UserInfo模型 */

    UserInfo user = new UserInfo();

    user.setLogin(paraLogin);

    user.setName(paraName);

    user.setPassword(paraPsw);

  

    /* 調用註冊用戶業務 */

    regService.registerUser(user);

  

    /* 添加user模型到view */

    view.addObject("user", user);

    /* 設置跳轉頁面 */

    view.setViewName("user/RegisterResult");

    return view;

}

}

加入log4j輸出日誌代碼很輕鬆,首先在類中用LogManager類實例化Logger對象。

1

2

/*聲明log4j對象*/

Logger  log = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

然後就可以輸出你想要輸出的信息了。

1

2

3

/*輸出日誌信息*/

log.info(paraLogin);

log.error(paraPsw);

日誌信息會輸出到控制檯,paraLogin的值爲xueshanfeihu,paraPsw的值爲123456。

1

2

2018-11-24 21:04:24,172 [http-nio-8080-exec-4] INFO   - xueshanfeihu

2018-11-24 21:04:24,227 [http-nio-8080-exec-4] ERROR  - 123456

使用log4j輸出log文件

輸出日誌信息到控制檯不是我們使用log4j的目的,目的是輸出日誌信息到文件。這次配置文件又起到作用了,打開log4j2.xml配置文件在appenders標籤下加入下面的子標籤。

1

2

3

4

5

6

<File name="FileAppender" fileName="D:/logs/mooc.log"

            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> 

 </File

 <Async name="AsyncAppender">

     <AppenderRef ref="FileAppender"/>

 </Async>

在root標籤下面加入下面的子標籤。

1

<appender-ref ref="AsyncAppender " />

完整的log4j2.xml配置文件內容如下。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<?xml version="1.0" encoding="UTF-8"?>

<configuration status="WARN">

    <appenders>

        <Console name="Console" target="SYSTEM_OUT">

            <PatternLayout

                    pattern="%d{DEFAULT} [%t] %-5p %c{36} - %m%n"/>

        </Console>

         <File name="FileAppender" fileName="D:/logs/mooc.log"

            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> 

        </File

        <Async name="AsyncAppender">

            <AppenderRef ref="FileAppender"/>

        </Async>

    </appenders>

    <loggers>

        <root level="info">

            <appender-ref ref="Console" />

            <appender-ref ref="AsyncAppender" />

        </root>

    </loggers>

</configuration>

配置文件修改完成後,日誌信息將同步輸出到mooc.log文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章