Java日志commons-logging log4j slf4j之間的關系
一、之前進行日志操作一般都是在一個類中加入如下代碼:
import org.apache.log4j.Logger; //引入的是log4j的包 private static final Logger LOG = Logger.getLogger(Test.class);
二、后來看見別人的代碼是這樣寫的:
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; //引入的是commons-logging的包 private static Log logger = LogFactory.getLog(AccountAction.class);
三、后來想起使用log4j要把mybatis的sql語句輸出還需要添加slf4j-api-x.x.x.jar和slf4j-log4j12-x.x.x.jar兩個包。看到這么多日志,亂七八糟的,所以就度娘了一下,稍微的了解了下這些日志之間的關系。這里順便給出個人較為膚淺的總結,看官有更好的理解可以留言,大家一起學習進步。
1)commons-logging和slf4j-api
這兩個日志包,都是提供出一個標準接口。類似于JDBC一樣,給出一個接口,具體怎么實現你們自己去玩。不同點在于commons-logging自己有一個簡單的實現。所以,在(二)的代碼中,如果引入了commons-logging沒有引入log4j的架包的話,日志能正常打印,打印效果如下:
如果加入log4j的架包的話(需要配置log4j.properties或者log4j.xml),日志效果如下:
簡單而言,commons-logging會先去查找commons-logging.properties配置文件,查找指定的實現日志,如果沒有,默認去查找log4j(畢竟都是自家做的東西嘛),如果沒有指定,也沒有找到log4j的架包實現,那么,commons-logging就自己上,結果就是圖片一中的效果。而slf4j就沒有默認實現。
2、slf4j-api和slf4j-log4j12
slf4j-api和commons-logging的接口肯定存在不一致的地方。有的日志實現可能沒有遵照slf4j-api的接口來,所以,中間轉換一層。所以slf4j-log4j12就是一個類似于一個轉換器的味道。這里轉換之后使用的是log4j。當然還有其他的,比如sli4j-slf4j-logback。
四、總結
1)自己的項目使用建議引入commons-logging和log4j兩個架包,然后使用(二)中的代碼;
2)有的項目使用的可能是slf4j,比如mybatis,如果還要繼續使用log4j就需要在引入slf4j-log4j12;
3)即使用log4j兩個組合:【commons-logging+log4j】和【slf4j+slf4j-log4j12+log4j】;
來自:http://my.oschina.net/u/2245029/blog/507761