工作3年啦,你竟然連Java日志體系都沒鬧懂?說不過去~
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
# 概要
# Log日志體系
# 背景/發(fā)展史
那就要從Java Log的發(fā)展歷程開始說起。
log4j(作者Ceki Gülcü)出來時(shí)就等到了廣泛的應(yīng)用(注意這里是直接使用),是Java日志事實(shí)上的標(biāo)準(zhǔn),并成為了Apache的項(xiàng)目
Apache要求把log4j并入到JDK,SUN拒絕,并在jdk1.4版本后增加了JUL(java.util.logging)
畢竟是JDK自帶的,JUL也有很多人用。同時(shí)還有其他日志組件,如SimpleLog等。這時(shí)如果有人想換成其他日志組件,如log4j換成JUL,因?yàn)閍pi完全不同,就需要改動(dòng)代碼。
Apache見此,開發(fā)了JCL(Jakarta Commons Logging),即commons-logging-xx.jar。它只提供一套通用的日志接口api,并不提供日志的實(shí)現(xiàn)。很好的設(shè)計(jì)原則嘛,依賴抽象而非實(shí)現(xiàn)。這樣應(yīng)用程序可以在運(yùn)行時(shí)選擇自己想要的日志實(shí)現(xiàn)組件。
這樣看上去也挺美好的,但是log4j的作者覺得JCL不好用,自己開發(fā)出slf4j,它跟JCL類似,本身不替供日志具體實(shí)現(xiàn),只對(duì)外提供接口或門面。目的就是為了替代JCL。同時(shí),還開發(fā)出logback,一個(gè)比log4j擁有更高性能的組件,目的是為了替代log4j。
Apache參考了logback,并做了一系列優(yōu)化,推出了log4j2
# 關(guān)系/依賴
JCL

JCL支持日志組件不多,不過也有很人用的,例如Spring
SLF4J

slf4j + logback
slf4j-api.jar?+?logback-classic.jar?+?logback-core.jarslf4j + log4j
slf4j-api.jar?+?slf4j-log4j12.jar?+?log4j.jarslf4j + jul
slf4j-api.jar?+?slf4j-jdk14.jar也可以只用slf4j無日志實(shí)現(xiàn)
slf4j-api.jar?+?slf4j-nop.jar
SLF4J的適配

你在用JCL
使用jcl-over-slf4j.jar適配你在用log4j
使用log4j-over-slf4j.jar適配你在用JUL
使用jul-to-slf4j.jar適配

很簡(jiǎn)單,就是加入jcl-over-slf4j.jar就好了。

你首先確認(rèn)需要統(tǒng)一日志的模塊、框架是使用哪個(gè)日志組件的,然后再找到sfl4j的適配器。
記得去掉無用的日志實(shí)現(xiàn)組件,只保留你要用的。
# 常見問題
Failed to load class org.slf4j.impl.StaticLoggerBinder
Multiple bindings
# 代碼規(guī)范
【強(qiáng)制】應(yīng)用中不可直接使用日志系統(tǒng)(Log4j、Logback)中的 API,而應(yīng)依賴使用日志框架 SLF4J 中的 API,使用門面模式的日志框架,有利于維護(hù)和各個(gè)類的日志處理方式統(tǒng)一。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Abc.class);
# 總結(jié)
往 期 推 薦
1、致歉!抖音Semi Design承認(rèn)參考阿里Ant Design
2、對(duì)比7種分布式事務(wù)方案,還是偏愛阿里開源的Seata,真香!
點(diǎn)分享
點(diǎn)收藏
點(diǎn)點(diǎn)贊
點(diǎn)在看





