天天看點

Log4j2 簡單使用

日志是一個系統經常用到的功能,我們可以在調試的時候依靠日志檢視輸出,在程式運作的時候通過檢視日志判斷程式運作狀态。在Java世界中,有一個非常著名的日志類庫——Log4j。現在Log4j也有了新版本,就是Log4j2。新版本的好處我就不多說了。讓讓我們來開始使用吧。

引入Log4j2

要使用Log4j2,第一步就是先導入它的jar包。如果是普通項目的話,到

log4j2

官網下載下傳jar包,然後将

log4j-api-2.7.jar

log4j-core-2.7.jar

添加到你項目的類路徑下。

如果使用Maven或者Gradle的話,到

mvn倉庫查詢

查找這兩個包,然後添加到項目依賴中。這樣就完成了準備工作。

然後打開項目,添加以下兩句,建立一個Logger并調試一些資訊。注意這裡的Logger和LogManager兩個類的全名分别是

org.apache.logging.log4j.LogManager

org.apache.logging.log4j.Logger

。不要和Java自帶的

java.util.logging

下的日志類搞混了。

Logger logger = LogManager.getLogger();
logger.debug("5555555");
           

然後運作一下項目,就可以看到對應的輸出了。

日志級别

如果你照着前面的做了,就會發現其實什麼輸出都沒有,隻有這麼一句話:

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

。這是說因為沒找到配置檔案,是以使用預設的日志級别,向控制台隻輸出錯誤資訊。這就引出了一個日志級别的問題。

日志分為幾個級别,按照從輕往重如此排列:trace、debug、info、warn、error、fatal。相應的Logger類也有這麼幾個對應方法,用于輸出相應的日志資訊。如果我們定義了一個級别,那麼低于這個級别的日志不會輸出。由于沒有配置檔案,是以預設情況下的日志級别是error,正如前面的輸出那樣。這樣一來,低于error的日志就不會輸出。是以我們回到剛才,将debug方法改為error方法,再次運作項目。這次出現了日志輸出。

22:21:58.600 [Test worker] ERROR yitian.bean.BeanTest - 5555555
           

配置檔案

前面已經簡單示範了Log4j2的用法。下面就來說說Log4j2的配置檔案。Log4j2既可以使用配置檔案配置,也可以使用程式設計方式用代碼來配置。這裡簡單說說配置檔案方式。Log4j2支援多種配置檔案,XML、JSON、YAML和perperties檔案都支援,當然最常用的還是XML檔案。将配置檔案放在類路徑下即可,如果使用Maven或者Gradle的話,就是在resources檔案夾下。

前面如果沒有配置檔案的話,Log4j2就會使用一個預設配置,等效于下面的配置檔案。

<?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>
           

配置檔案有兩個主要的地方,第一個是Appender節點,這個節點下會有很多Appender,也就是我們日志輸出的目的地,可以是控制台也可以是某個檔案,甚至是專用的遠端日志伺服器。預設情況下隻有一個控制台。第二種重要的節點是Loggers節點,這個節點下可以有很多個Logger,每個Logger可以記錄不同的資訊,Logger之間也可以共享某些配置。上面定義了一個Root Logger,如果沒有指定Logger 的名稱或者指定的Logger不存在,就會使用Root,而且Root Logger下的配置預設會被其他Logger繼承,除非它們定義了自己的配置。

然後我們再回頭看看Appenders節點,其中有這麼一段:

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

。這裡定義的就是日志的輸出格式。下面來簡單說說常用的輸出格式。

  • %d{HH:mm:ss.SSS} 輸出時間,精确度為毫秒。
  • %t 輸出目前線程的名稱。
  • %-5level 輸出日志級别,-5表示左對齊并且固定占5個字元寬度,如果不足用空格補齊。
  • %logger 輸出Logger名稱,如果是Root的話就沒有名稱。
  • %msg 日志資訊,也就是我們傳入的資訊。
  • %n 換行。
  • %F 輸出所在的檔案名。
  • %L 輸出行号。
  • %M 輸出所在方法名。
  • %l 輸出語句所在的位置資訊,包括檔案名、類名、方法名、行号。

自定義配置

自定義Logger

說了這麼多,現在我們就可以開始自定義配置檔案了。首先我們來添加一個新的Logger,來記錄所有資訊,這個Logger的名稱就叫做TRACE_ALL吧。這個Logger有兩個屬性,level指定記錄級别,additivity指定傳遞性。假如傳遞性指定為true,如果我們現在使用TRACE_ALL記錄一個debug級别的日志,由于debug級别也符合Root的記錄範圍,這樣這個日志就會記錄兩遍。最後,我們用

<AppenderRef ref="Console"/>

指定使用上面的控制台Appender。

現在配置檔案應該是這樣。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <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="debug">
            <AppenderRef ref="Console"/>
        </Root>
        <Logger name="TRACE_ALL" level="trace" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
    </Loggers>
</Configuration>
           

程式代碼是這樣的。在調用getLogger的時候指定要使用哪一個Logger。

Logger logger = LogManager.getLogger("TRACE_ALL");
logger.info("5555555");
           

自定義Appender

除了使用Console作為日志輸出目的地之外,我們還可以定義其他的輸出,比如檔案。下面我們來建立一個檔案Appender。在Appenders節點下建立一個File節點,name和fileName屬性分别指定Appender名稱和目的檔案名。然後我們指定TRACE_ALL Logger同時将日志輸出到控制台和檔案。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <File name="File" fileName="D:\Desktop\mylog.txt">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
        <Logger name="TRACE_ALL" level="trace" additivity="true">
            <AppenderRef ref="File"/>
            <AppenderRef ref="Console"/>
        </Logger>
    </Loggers>
</Configuration>
           

再次運作程式,我們就會發現這次在對應的路徑下多出一個檔案,這個檔案的内容就是我們的輸出。

到此為止,大家應該可以基本使用Log4j2了。如果有更加複雜的需求,就需要自己去查閱相關資料了。

參考資料

http://blog.csdn.net/autfish/article/details/51203709