天天看點

Slf4j與log4j及log4j2的關系及使用方法

Slf4j與log4j及log4j2的關系及使用方法

slf4j

slf4j僅僅是一個為Java程式提供日志輸出的統一接口,并不是一個具體的日志實作方案,就比如JDBC一樣,隻是一種規則而已,是以單獨的slf4j是不能工作的,必須搭配其他具體的日志實作方案,比如log4j或者log4j2,要在系統中使用slf4j,我們需要引入的核心包為:slf4j-api-1.6.4.jar。

如果不想每次都寫private  final Logger logger = LoggerFactory.getLogger(XXX.class); 可以在方法前用注解@Slf4j,然後直接使用log.info去列印日志。如果注解@Slf4j注入後找不到變量log,那就給IDE安裝lombok插件(idea中:1、File  → settings →  Plugins,  然後點選“Browse repositories”;2、輸入 lombok 搜尋插件, 點install安裝,安裝完重新開機idea)。

log4j

如果在我們系統中單獨使用log4j的話,我們隻需要引入log4j的核心包就可以了,我這裡用的是:log4j-1.2.17.jar,然後在系統中使用如下代碼輸出日志:

private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Log4jTest.class);

在系統的src目錄下添加依賴的配置檔案:

log4j2

  如果在我們系統中單獨使用log4j2的話,我們隻需要引入log4j2的核心包就可以了,我這裡用的是:log4j-api-2.7.jar和log4j-core-2.7.jar,然後在系統中使用如下代碼輸出日志:

private static org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(Log4jTest.class);

 在系統的src目錄下添加依賴的配置檔案。

關于log4j2的官方文檔介紹,請檢視:http://logging.apache.org/log4j/2.x/index.html

關于log4j2相關配置檔案,大家可以從官方文檔中了解,也可以參考:http://java12345678.iteye.com/blog/2382929

log4j與log4j2的差別:

1.擷取Logger的api不一樣,log4j的api為org.apache.log4j.Logger,而log4j2的api為org.apache.logging.log4j.Logger

2.配置方式不一樣,log4j2對properties的配置支援不是很好,它的格式一般為xml格式或者yaml格式,這種格式的可讀性比較好,各種配置一目了然

3.Log4j2.0基于LMAX Disruptor的異步日志在多線程環境下性能會遠遠優于Log4j 1.x和logback(官方資料是10倍以上)。

slf4j+log4j

如果我們在系統中需要使用slf4j和log4j來進行日志輸出的話,我們需要引入下面的橋接jar包:

log4j核心jar包:log4j-1.2.17.jar

slf4j核心jar包:slf4j-api-1.6.4.jar

slf4j與log4j的橋接包:slf4j-log4j12-1.6.1.jar,這個包的作用就是使用slf4j的api,但是底層實作是基于log4j.

         private static final Logger logger = LoggerFactory.getLogger(Slf4jTest2.class);

slf4j+log4j2

如果我們在系統中需要使用slf4j和log4j2來進行日志輸出的話,我們需要引入下面的jar包:

log4j2核心jar包:log4j-api-2.7.jar和log4j-core-2.7.jar

slf4j核心jar包:slf4j-api-1.6.4.jar

slf4j與log4j2的橋接包:log4j-slf4j-impl-2.7.jar,這個包的作用就是使用slf4j的api,但是底層實作是基于log4j2.

  private static final Logger logger = LoggerFactory.getLogger(Slf4jTest2.class);

slf4j+log4j不修改代碼更新到log4j2

如果我們系統中剛開始用的是slf4j和log4j,然後出于性能考慮,要更新到slf4j和log4j2,并且不需要改動任何代碼的話(因為我們系統可能是一個大工程,然後基本上每個類都會有日志輸出,改動代碼可能牽一發而動全身),出于這個考慮,我們可以這樣來進行修改(修改依賴):

1、删除項目中存在的Log4j1.x所必須的log4j和slf4j-log4j12等依賴,例如從我們上面做的去更新的話,需要删除log4j-1.2.17.jar和slf4j-log4j12-1.6.1.jar

2、添加log4j2和slf4j橋接包:log4j-slf4j-impl-2.7.jar替換log4j和slf4j橋接包:slf4j-log4j12-1.6.1.jar

3、如果我們在系統中使用了log4j的api去擷取Logger的話:

org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Log4jTest.class);

我們需要添加log4j-1.2-api-2.7.jar去替換log4j-1.2.17.jar

4、将log4j的properties檔案修改為log4j2的xml檔案

然後,同樣在系統中使用slf4j的方式擷取日志:

org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Self4jTest.class);

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
 <!--日志級别以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
 <!--Configuration後面的status,這個用于設定log4j2自身内部的資訊輸出,可以不設定,當設定成trace時,你會看到log4j2内部各種詳細輸出-->
 <!--monitorInterval:Log4j能夠自動檢測修改配置 檔案和重新配置本身,設定間隔秒數-->
 <configuration status="WARN" monitorInterval="30">
     <!--先定義所有的appender-->
     <appenders>
     <!--這個輸出控制台的配置-->
         <console name="Console" target="SYSTEM_OUT">
         <!--輸出日志的格式-->
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
         </console>
     <!--檔案會列印出所有資訊,這個log每次運作程式會自動清空,由append屬性決定,這個也挺有用的,适合臨時測試用-->
     <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>
     <!-- 這個會列印出所有的info及以下級别的資訊,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的檔案夾下面并進行壓縮,作為存檔-->
         <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
             <!--控制台隻輸出level及以上級别的資訊(onMatch),其他的直接拒絕(onMismatch)-->        
             <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         </RollingFile>
         <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
             <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         <!-- DefaultRolloverStrategy屬性如不設定,則預設為最多同一檔案夾下7個檔案,這裡設定了20 -->
             <DefaultRolloverStrategy max="20"/>
         </RollingFile>
         <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
             <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         </RollingFile>
     </appenders>
     <!--然後定義logger,隻有定義了logger并引入的appender,appender才會生效-->
     <loggers>
         <!--過濾掉spring和mybatis的一些無用的DEBUG資訊-->
         <logger name="org.springframework" level="INFO"></logger>
         <logger name="org.mybatis" level="INFO"></logger>
         <root level="all">
             <appender-ref ref="Console"/>
             <appender-ref ref="RollingFileInfo"/>
             <appender-ref ref="RollingFileWarn"/>
             <appender-ref ref="RollingFileError"/>
         </root>
     </loggers>
 </configuration>