首页 快递行业资讯 一文讲尽门面日志slf4j和log4j、log4j2、logback依靠jar引证联系

一文讲尽门面日志slf4j和log4j、log4j2、logback依靠jar引证联系

前语 之前都是运用SparkStreaming开发,最近计划学习一下Flink,就从官网下载了Flink 1.11,计划搞一个客户端,将程序提交在yarn上。由于Flink从1.7…


前语

之前都是运用SparkStreaming开发,最近计划学习一下Flink,就从官网下载了Flink 1.11,计划搞一个客户端,将程序提交在yarn上。由于Flink从1.7之后就不再供给Hadoop的依靠,所以许多依靠就要自己下载,所以各种ClassNotFoundException,其间以log*.class为首的分外猖獗,或许是由于flink和Hadoop的日志完成有点差异,就一向哐哐哐报错,slf4j、log4j、logback各种jar包十几个,百度良久也没搞清各个jar有什么差异,用在何处,就计划自己总结一下。


 


log开展前史

Long long Ago,和刚学Java的时分相同,都是用System.out.println控制台打印来检查程序输出是否契合自己的预期,这是一种比较原始的办法,无法主动区别日志的类型,简直无法用于出产体系中。

从JDK1.4开端供给java.until.logging日志结构来打印日志,可是大佬觉得JUL太难用了,就自己手撸了个log4j,后来log4j发现安全漏洞,加上代码结构问题难以保护,所以从1.2就中止更新log4j,并又从头手撸了个log4j2,再后来,这个大佬又又又撸了一个功用更高、功用更全的logback。

从此,这个大佬构建了log的国际,也发明了最常见的日志结构:log4j、log4j2、logback。


 


SLF4J( Simple Logging Facade for Java )

现在现已提及了四个日志结构,假如咱们想用来记载日志,除了必要的配置文件,还需求在代码中获取Logger,打印日志。

代码如下:

    
// 运用log4j,需求log4j.jar
import org.apache.log4j.Logger;
Logger logger_log4j = Logger.getLogger(Test.class);
logger_log4j.info("Hello World!");

// 运用log4j2,需求log4j-api.jar、log4j-core.jar
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
Logger logger_log4j2 = LogManager.getLogger(Test.class);
logger_log4j2.info("Hello World!");

// logback,需求logback-classic.jar、logback-core.jar
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
Logger logger_logback = new LoggerContext().getLogger(Test.class);
logger_logback.info("Hello World!");

// java.until.logging,简称jul
import java.util.logging.Logger;
Logger logger_jul = Logger.getLogger("java.Test");

为什么要运用门面体系

从上面不难看出,运用不同的日志结构,就要引进不同的jar包,运用不同的代码获取Logger。

假定一个项目在绵长的晋级过程中,想从jul晋级到logback,那么就需求修正代码来获取新的Logger。假如100个class中运用了jul,就得修正100个当地,这是多么一个繁琐的作业!!

门面体系的效果

所以Apache Commons Logging呈现了。

Common-logging供给了一个日志进口,称作"门面日志",即它不担任写日志,而是「供给用一个一致的接口,经过jar来决议运用的日志结构」,这样就不要再替换结构的时分再修正代码了。后来开发了log4j的大佬又由于厌弃Common-logging难用,开发了门面日志结构「slf4j」,今日就拿slf4j叙述门面日志。

门面日志和规划形式中的外观形式千篇一律,自身不供给服务,为子体系供给一致的进口,封装子体系的复杂性,便于客户端调用。slf4j就像是菜鸟驿站,自身没有快递服务,可是供给顺丰、中通等快递服务,至于你想用顺丰仍是用中通,彻底取决于你的主意。

运用slf4j的代码如下:

    
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(Test.class);
logger.info("Hello World!")

这行代码就像是你在菜鸟驿站里要寄东西(logger),考虑究竟用哪家快递?A minute later...  决议用顺丰(logback),就填了顺丰的快递单(放入logback.jar),可是你看微信余额还有10块,钱不行,只能用中通(log4j),所以你就退了顺丰的单子(移除logback.jar),填了中通的快递单(放入log4j.jar),然后宣布快递(打印日志)。

那么slf4j怎么决议运用哪个结构日志呢,而且引进哪些jar包呢?

如slf4j官方图所示:

依靠联系图

如图便是slf4j和日志结构的组合依靠结构图,运用slf4j需求首要导入「slf4j-api.jar」

和log4j合作,需求导入「log4j.jar」,以及桥接包「slf4j-log412.jar」

官方图美中缺乏的是没有log4j2依靠jar的联系,和log4j2合作需求导入log4j2的「log4j-api.jar」「log4j-core.jar」和桥接包「log4j-slf4j-impl.jar」

logback只需求导入「logback-classic.jar」「logback-core.jar」即可,不需求桥接包。


 


什么是桥接包,为什么logback没有

先让来让咱们看看slf4j从LoggerFactory.getLogger()开端,究竟干了什么。

流程图如下:

slf4j作业流程图

原理便是便是让ClassLoader从classpath(依靠的jar)中找到「StaticLoggerBinder」这个类,然后运用他来回来log4j、logback中的Logger,然后打印日志。

所谓的桥接包,便是完成StaticLoggerBinder类,用来衔接slf4j和日志结构。由于log4j和log4j2刚开端没有StaticLoggerBinder这个类,为了不改动程序结构,只能从头写一个新的jar来完成StaticLoggerBinder。而logback呈现slf4j之后,所以在logback自身的jar中完成了StaticLoggerBinder,所以就不需求桥接包。

StaticLoggerBinder完成了运用底层日志结构创立Logger的功用,各自的StaticLoggerBinder为slf4j供给的Logger,再供给给用户打印日志。

log4j和log4j2桥接包及logback依靠里,都有StaticLoggerBinder类。

logback的StaticLoggerBinder
log4j的StaticLoggerBinder
log4j2的StaticLoggerBinder



运用总结

"Class path contains multiple SLF4J bindings."

在运用slf4j的时分会遇到以上的陈述信息。我也曾遇到过web服务由于slf4j问题发动失利。究其底子是由于logback-classic、log4j-slf4j-impl、slf4j-log412、slf4j-jdk这些jar不能一起存在。他们都完成了StaticLoggerBinder类而导致抵触,slf4j无法确认究竟用哪个日志结构。


 


结语

以上是结合官网以及自己调试代码的一些总结,期望对我们了解slf4j及其使用有协助,其间缺乏的当地还望指出,共同进步,共勉!!!



有道无术,术可成;有术无道,止于术



Java之道


好文章,我
在看❤️

本文来自网络,不代表快递资讯网立场。转载请注明出处: http://www.llaiot.com/express-industry-information/2924.html
上一篇
下一篇

为您推荐

返回顶部