Java簡單日志記錄外觀(slf4j)是各種日志記錄框架的簡單外觀,例如JDK日志記錄(java.util.logging),log4j或logback。 即使它包含綁定的tat,也會將所有記錄器操作委派給另一個稱為jakarta commons logging(JCL)的眾所周知的記錄界面。
Logback是log4j記錄器API的后繼者,實際上,兩個項目具有相同的父項,但是logback提供了優于log4j的一些優點,例如更好的性能和更少的內存消耗,自動重載配置文件或篩選功能,以列舉一些功能。
slf4j的本機實現是logback,因此將兩者用作記錄器框架都意味著零內存和計算開銷。
首先,我們將slf4j和logback作為依賴項添加到pom中。
<properties><slf4j.version>1.6.4</slf4j.version><logback.version>1.0.1</logback.version>
</properties><dependencies><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>${logback.version}</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>${logback.version}</version></dependency></dependencies>
請注意,三個文件是必需的,一個文件用于slf4j,兩個文件用于注銷。 最后兩個依賴項將根據您的日志記錄框架而變化,例如,如果您仍然想使用log4j,我們將擁有log4j依賴項本身和slf4j-log4j12,而不是具有logback依賴項。
下一步是創建配置文件。 Logback支持兩種格式的配置文件,即傳統方式,使用XML或Groovy DSL樣式。 讓我們從傳統方式開始,我們將在類路徑中創建一個名為logback.xml的文件。 文件名是必需的,但logback-test.xml也是有效的。 如果兩個文件都在類路徑中找到,則將使用以-test結尾的文件。
<?xml version="1.0" encoding="UTF-8"?><configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!-- encoders are assigned the typech.qos.logback.classic.encoder.PatternLayoutEncoder by default --><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern></encoder></appender><logger name="com.lordofthejars.foo" level="INFO" additivity="false"><appender-ref ref="STDOUT" /></logger><!-- Strictly speaking, the level attribute is not necessary since --><!-- the level of the root level is set to DEBUG by default. --><root level="DEBUG"> <appender-ref ref="STDOUT" /></root> </configuration>
一般而言,文件非常直觀,我們定義了追加程序(日志消息的輸出),在此情況下,它定義為控制臺,模式,最后是foo中存在的類的根級別記錄器(DEBUG)和不同級別的記錄器(INFO)包。
顯然,這種格式比典型的log4j.properties更具可讀性。 回想一下可加性屬性,名為STDOUT的附加程序已附加到兩個記錄器,root和com.lordofthejars.foo。 因為根記錄器是所有記錄器的祖先,所以com.lordofthejars.foo記錄器發出的記錄請求將被輸出兩次。 為避免這種情況,您可以將additivity屬性設置為false,并且消息將僅打印一次。
現在讓我們創建將使用slf4j的類。 在com.lordofthejars.bar上創建了名為BarComponent的第一類:
public class BarComponent {private static final Logger logger = LoggerFactory.getLogger(BarComponent.class);public void bar() {String name = "lordofthejars";logger.info("Hello from Bar.");logger.debug("In bar my name is {}.", name);}}
請注意與log4j有兩個大區別。 第一個是在每個日志調用之上不再需要典型的if結構。 另一個是一對“ {}”。 僅在評估是否記錄后,logback才會格式化消息,并用給定的字符串值替換“ {}”。
另一個名為FooComponent的是在com.lordofthejars.foo中創建的:
public class FooComponent {private static final Logger logger = LoggerFactory.getLogger(FooComponent.class);public void foo() {String name = "Alex";logger.info("Hello from Foo.");logger.debug("In foo my name is {}.", name);}}
現在使用先前的配置調用foo和bar方法,生成的輸出將是:
13:49:59.586 [main] INFO c.l.b.BarComponent - Hello from Bar.
13:49:59.617 [main] DEBUG c.l.b.BarComponent - In bar today is 5/3/2012
13:49:59.618 [main] INFO c.l.f.FooComponent - Hello from Foo.
請注意,沒有顯示foo方法中的調試行。 可以,因為我們已經設置為這種方式。
我們要采取的下一步是配置logback,但不是使用xml方法,而是使用groovy DSL方法。 Logback將優先選擇groovy配置而不是xml配置,因此如果您混用配置方法,請記住這一點。
所以首先要做的是添加Groovy作為依賴項。
<dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy</artifactId><version>${groovy.version}</version><scope>runtime</scope>
</dependency>
然后,我們將創建以前使用groovy格式創建的相同配置。
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.core.ConsoleAppenderimport static ch.qos.logback.classic.Level.DEBUG
import static ch.qos.logback.classic.Level.INFOappender("STDOUT", ConsoleAppender) {encoder(PatternLayoutEncoder) {pattern = "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} Groovy - %msg%n"}
}logger("com.lordofthejars.foo", INFO)
root(DEBUG, ["STDOUT"])
您可以將xml方法的相同參數標識為Groovy函數。
我希望您發現這篇文章有用,并且在下一個項目中,如果可以的話,將slf4j與logback結合使用,您的應用程序將比使用log4j進行記錄運行得更快。
下載代碼
參考:來自JCG合作伙伴 Alex Soto的slf4j和logback教程,來自One Jar To Rule Them All博客。
翻譯自: https://www.javacodegeeks.com/2012/04/using-slf4j-with-logback-tutorial.html