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


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);

 

 

使用slf4j庫作為你的Java應用日志API層有很多好處,這里我會展示一小部分關於如何使用和配置它的例子。

你可以把slf4j想成一個Java的接口,然后你需要實現這個接口,從而在運行時提供實際的日志記錄,例如把日志寫到控制台(STDOUT)或者一個文件上等等。每種實現(或成為綁定)都顯而易見地有他們自己的方式來配置日志的輸出,但是你的應用對實現者並無感知並且一直使用相同的org.slf4j.Logger API。讓我們看看如何在實際中使用它。

使用slf4j做簡單的日志記錄

創建基於Maven的工程,在pom.xml中添加如下內容

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency>

現在你可以在你的Java代碼中這樣使用Logger

package deng; import org.slf4j.*; public class Hello { static Logger LOGGER = LoggerFactory.getLogger(Hello.class); public static void main(String[] args) { for (int i = 0; i < 10; i++) if (i % 2 == 0) LOGGER.info("Hello {}", i); else LOGGER.debug("I am on index {}", i); } }

以上代碼可以編譯通過,但是當你運行它時,你會看到這樣的輸出

bash> java deng.Hello
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

上面的意思是,在運行時,你沒有做日志的實現(或者說日志的綁定),所以slf4j簡簡單單的使用了一個什么也不會做的空實現。
為了看到正確的輸出,你應該嘗試使用一個簡單(simple)的實現,這個實現根本不需要任何配置!只要回到pom.xml然后添加如下配置

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.5</version> </dependency>

現在你可以在控制台(STDOUT)看見INFO級別的日志輸出了。這個簡單的logger會默認顯示任何INFO或者更高級別的信息。想要看DEBUG級別的信息,你需要在Java啟動時傳入這個系統屬性(system property)

-Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG

使用slf4j與Log4j日志

現在我們可以試驗並更換不同的日志實現,但你的程序代碼可以保持不變。
我們要做的是用另一個流行的日志實現來替換掉slf4j-simple,比如Log4j。

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency>

又一次,我們必須對我們選的每一個日志實現做配置。在這個例子中,我們需要一個文件src/main/resources/log4j.properties

log4j.rootLogger=DEBUG, STDOUT
log4j.logger.deng=INFO
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

重運行你的程序,你會看到同樣的輸出結果。

使用slf4j和JDK日志

JDK實際上帶有一個日志包,你可以在pom.xml中替換為另一個日志實現。

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jdk14</artifactId> <version>1.7.5</version> </dependency>

現在JDK日志的配置起來有一點困難。這里不僅需要一個配置文件src/main/resources/logging.properties,你還需要添加一個系統屬性

-Djava.util.logging.config.file=logging.properties

這是一個logging.properties的示例

level=INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST

使用slf4j和Logback日志

Logback日志實現是一個高質量的實現。如果你想在項目中寫認真的代碼,你會想要考慮這中方式。還是修改你的pom.xml文件,替換成這樣

<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.0.13</version> </dependency>

這是一個簡單的配置src/main/resources/logback.xml

 
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <logger name="deng" level="DEBUG"/> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM