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