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