1. 程式人生 > >淺談Log4j和Log4j2的區別

淺談Log4j和Log4j2的區別

淺談Log4j和Log4j2的區別

1、配置文件類型
log4j是通過一個.properties的文件作為主配置文件的,而現在的log4j 2則已經棄用了這種方式,采用的是.xml,.json或者.jsn這種方式來做,可能這也是技術發展的一個必然性,畢竟properties文件的可閱讀性真的是有點差。

2、核心JAR包
log4j只需要引入一個jar包即可,

<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>

</dependency>

而log4j 2則是需要2個核心

        <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.5</version>
        </dependency>
        <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>2.5</version>
        </dependency>

大家發現沒,log4j和log4j 2的包路徑是不同的,Apache為了區分,包路徑都更新了,這樣大家甚至可以在一個項目中使用2個版本的日誌輸出哦!(不過我想你們沒有那麽調皮吧,嘿嘿)

3、文件渲染
log4j想要生效,我們需要在web.xml中進行配置,

<listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener> <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:config/log4j.properties</param-value>
    </context-param>
    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <param-value>60000</param-value>

這段配置目的在於告訴工程去哪加載log4j的配置文件和定義一個掃描器,這樣可以隨心所欲的放置log4j配置文件。
log4j2就比較簡單,以maven工程為例,我們只需要把log4j2.xml放到工程resource目錄下就行了。大家記住一個細節點,是log4j2.xml,而不是log4j.xml,xml名字少個2都不行!!
喜歡做學問的小夥伴,有興趣可以去研究下,照我估計應該是在log4j2的包裏面配置死了,而且大家可以嘗試下怎麽自定義log4j2.xml的位置。

4、Log調用
log4j和log4j2調用都是很簡單的。
log4j:

    import org.apache.log4j.Logger;
    private final Logger LOGGER = Logger.getLogger(Test.class.getName());

log4j2:

    import org.apache.logging.log4j.Level;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    private static Logger logger = LogManager.getLogger(Test.class.getName());

5、配置文件方式
最關鍵的最大的不同,那就是配置文件的區別了,大家具體使用的時候再根據你的情況進行配置就行了。
log4j2 例子如下:

<?xml version="1.0" encoding="UTF-8"?>    
<configuration status="error">  
<!--     先定義所有的appender -->  
        <appenders>  
<!--         這個輸出控制臺的配置 -->  
                <Console name="Console" target="SYSTEM_OUT">  
<!--             控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch) -->  
                        <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>  
<!--             這個都知道是輸出日誌的格式 -->  
                        <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>  
                </Console>  

<!--         文件會打印出所有信息,這個log每次運行程序會自動清空,由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>  

總結:
技術總是在不斷進步的,我們不能局限在已知的知識領域中,要不斷去創新,去嘗試!

附:
日誌的級別:    
我們現在要調用logger的方法,不過在這個Logger對象中,有很多方法,所以要先了解log4j的日誌級別,log4j規定了默認的幾個級別:trace<debug<info<warn<error<fatal等。這裏要說明一下:    

級別之間是包含的關系,意思是如果你設置日誌級別是trace,則大於等於這個級別的日誌都會輸出。
基本上默認的級別沒多大區別,就是一個默認的設定。你可以通過它的API自己定義級別。你也可以隨意調用這些方法,不過你要在配置文件裏面好好處理了,否則就起不到日誌的作用了,而且也不易讀,相當於一個規範,你要完全定義一套也可以,不用沒多大必要。從我們實驗的結果可以看出,log4j默認的優先級為ERROR或者WARN(實際上是ERROR)    
這不同的級別的含義大家都很容易理解,這裏就簡單介紹一下:

trace: 是追蹤,就是程序推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關系,我們可以設置最低日誌級別不讓他輸出。
debug:調試麽,我一般就只用這個作為最低級別,trace壓根不用。是在沒辦法就用eclipse或者idea的debug功能就好了麽。
info: 輸出一下你感興趣的或者重要的信息,這個用的最多了。
warn: 有些信息不是錯誤信息,但是也要給程序員的一些提示,類似於eclipse中代碼的驗證不是有error
和warn(不算錯誤但是也請註意,比如以下depressed的方法)。
error: 錯誤信息。用的也比較多。
fatal:級別比較高了。重大錯誤,這種級別你可以直接停止程序了,是不應該出現的錯誤麽!不用那麽緊張,其實就是一個程度的問題。

關註我,時刻獲取大量視頻

技術分享圖片

淺談Log4j和Log4j2的區別