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 type
ch.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.ConsoleAppender
import static ch.qos.logback.classic.Level.DEBUG
import static ch.qos.logback.classic.Level.INFO
appender("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