SLF4J不同於其他日志類庫,與其它有很大的不同。SLF4J(Simple logging Facade for Java)不是一個真正的日志實現,而是一個抽象層( abstraction layer),它允許你在后台使用任意一個日志類庫。如果是在編寫供內外部都可以使用的API或者通用類庫,那么你真不會希望使用你類庫的客戶端必須使用你選擇的日志類庫。
如果一個項目已經使用了log4j,而你加載了一個類庫,比方說 Apache Active MQ——它依賴於於另外一個日志類庫logback,那么你就需要把它也加載進去。但如果Apache Active MQ使用了SLF4J,你可以繼續使用你的日志類庫而無語忍受加載和維護一個新的日志框架的痛苦。
總的來說,SLF4J使你的代碼獨立於任意一個特定的日志API,這是一個對於開發API的開發者很好的思想。雖然抽象日志類庫的思想已經不是新鮮的事物而且Apache commons logging也已經在使用這種思想了,但現在SLF4J正迅速成為Java世界的日志標准。讓我們再看看幾個使用SLF4J而不是log4j、logback或者java.util.logging的理由。
怎么用SLF4J做Log4J的日志記錄
為了使用SLF4J,不僅需要包含SLF4J的API jar包,還需要相關Jar包。如果你想要使用和Log4J 一起使用SLF4J,需要包含以下的Jar包在classpath中。例如:
- slf4j-api-1.6.1.jar – JAR for SLF4J API
- log4j-1.2.16.jar – JAR for Log4J API
- slf4j-log4j12-1.6.1.jar – Log4J Adapter for SLF4J
總結
建議使用SLF4J的而不是直接使用 Log4j, commons logging, logback 或者 java.util.logging 已經足夠充分了。
在代碼中使用SLF4J的logger,不要直接使用log4j的。
SLF4J提供了基於占位符的日志方法,這通過去除檢查isDebugEnabled(), isInfoEnabled()等等,提高了代碼可讀性。
slf4j-api中public final class LoggerFactor類中private final static void bind() 方法會尋找具體的日志實現類綁定,主要通過StaticLoggerBinder.getSingleton();
語句調用slf4j-log4j12鏈接slf4j-api和log4j中間的適配器。它實現了slf4j-apiz中StaticLoggerBinder接口,從而使得在編譯時綁定的是slf4j-log4j12的getSingleton()方法
log4j,這個是具體的日志系統。通過slf4j-log4j12初始化Log4j,達到最終日志的輸出。
log4j2的依賴
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.13</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.13</version> <scope>runtime</scope> </dependency> <!--核心log4j2jar包--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.4.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.4.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.4.1</version> </dependency>
http://www.importnew.com/7450.html
http://blog.csdn.net/tengdazhang770960436/article/details/18006127