如果現(xiàn)有系統(tǒng)使用JCL作為日志門面,又確實(shí)面臨著JCL的ClassLoader機(jī)制帶來(lái)的問(wèn)題,完全可以引入slf4j并通過(guò)橋接庫(kù)將JCL api輸出的日志橋接至slf4j,再通過(guò)適配庫(kù)適配至現(xiàn)有的日志輸出服務(wù)(如log4j),如下圖:
這樣做不需要任何代碼級(jí)的改造,就可以解決JCL的ClassLoader帶來(lái)的問(wèn)題,但沒(méi)有辦法享受日志模板等slf4j的api帶來(lái)的優(yōu)點(diǎn)。不過(guò)之后在現(xiàn)系統(tǒng)上開發(fā)的新功能就可以使用slf4j的api了,老代碼也可以分批進(jìn)行改造。
如果現(xiàn)有系統(tǒng)使用JCL作為日志門面,又頭疼JCL不支持logback和log4j2等新的日志服務(wù),也可以通過(guò)橋接庫(kù)以slf4j替代JCL,但同樣無(wú)法直接享受slf4j api的優(yōu)點(diǎn)。
如果想要使用slf4j的api,那么就不得不進(jìn)行代碼改造了,當(dāng)然改造也可以參考1中提到的方式逐步進(jìn)行。
如果現(xiàn)系統(tǒng)面臨著log4j的性能問(wèn)題,可以使用Apache Logging提供的log4j到log4j2的橋接庫(kù)log4j-1.2-api,把通過(guò)log4j api輸出的日志橋接至log4j2。這樣可以最快地使用上log4j2的先進(jìn)性能,但組件中缺失了slf4j,對(duì)后續(xù)進(jìn)行日志架構(gòu)改造的靈活性有影響。另一種辦法是先把log4j橋接至slf4j,再使用slf4j到log4j2的適配庫(kù)。這樣做稍微麻煩了一點(diǎn),但可以逐步將系統(tǒng)中的日志輸出標(biāo)準(zhǔn)化為使用slf4j的api,為后面的工作打好基礎(chǔ)。