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