阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用SLF4J和Logback

69次阅读
没有评论

共计 2369 个字符,预计需要花费 6 分钟才能阅读完成。

前面介绍了 Commons Logging 和 Log4j 这一对好基友,它们一个负责充当日志 API,一个负责实现日志底层,搭配使用非常便于开发。

有的童鞋可能还听说过 SLF4J 和 Logback。这两个东东看上去也像日志,它们又是啥?

其实 SLF4J 类似于 Commons Logging,也是一个日志接口,而 Logback 类似于 Log4j,是一个日志的实现。

为什么有了 Commons Logging 和 Log4j,又会蹦出来 SLF4J 和 Logback?这是因为 Java 有着非常悠久的开源历史,不但 OpenJDK 本身是开源的,而且我们用到的第三方库,几乎全部都是开源的。开源生态丰富的一个特定就是,同一个功能,可以找到若干种互相竞争的开源库。

因为对 Commons Logging 的接口不满意,有人就搞了 SLF4J。因为对 Log4j 的性能不满意,有人就搞了 Logback。

我们先来看看 SLF4J 对 Commons Logging 的接口有何改进。在 Commons Logging 中,我们要打印日志,有时候得这么写:

int score = 99;
p.setScore(score);
log.info("Set score" + score + "for Person" + p.getName() + "ok.");

拼字符串是一个非常麻烦的事情,所以 SLF4J 的日志接口改进成这样了:

int score = 99;
p.setScore(score);
logger.info("Set score {} for Person {} ok.", score, p.getName());

我们靠猜也能猜出来,SLF4J 的日志接口传入的是一个带占位符的字符串,用后面的变量自动替换占位符,所以看起来更加自然。

如何使用 SLF4J?它的接口实际上和 Commons Logging 几乎一模一样:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class Main {final Logger logger = LoggerFactory.getLogger(getClass());
}

对比一下 Commons Logging 和 SLF4J 的接口:

Commons Logging SLF4J
org.apache.commons.logging.Log org.slf4j.Logger
org.apache.commons.logging.LogFactory org.slf4j.LoggerFactory

不同之处就是 Log 变成了 LoggerLogFactory 变成了LoggerFactory

使用 SLF4J 和 Logback 和前面讲到的使用 Commons Logging 加 Log4j 是类似的,先分别下载 SLF4J 和 Logback,然后把以下 jar 包放到 classpath 下:

  • slf4j-api-1.7.x.jar
  • logback-classic-1.2.x.jar
  • logback-core-1.2.x.jar

然后使用 SLF4J 的 LoggerLoggerFactory即可。

和 Log4j 类似,我们仍然需要一个 Logback 的配置文件,把 logback.xml 放到 classpath 下,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
		</encoder>
	</appender>

	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
			<charset>utf-8</charset>
		</encoder>
		<file>log/output.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
			<fileNamePattern>log/output.log.%i</fileNamePattern>
		</rollingPolicy>
		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
			<MaxFileSize>1MB</MaxFileSize>
		</triggeringPolicy>
	</appender>

	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	</root>
</configuration>

运行即可获得类似如下的输出:

13:15:25.328 [main] INFO  com.itranswarp.learnjava.Main - Start process...

从目前的趋势来看,越来越多的开源项目从 Commons Logging 加 Log4j 转向了 SLF4J 加 Logback。

练习

根据配置文件,观察 Logback 写入的日志文件。

下载练习

小结

SLF4J 和 Logback 可以取代 Commons Logging 和 Log4j;

始终使用 SLF4J 的接口写入日志,使用 Logback 只需要配置,不需要修改代码。

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计2369字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中