commons-logging和log4j
在項目中,我們經常會看到兩個 jar 包:commons-logging.jar 和 log4j.rar。
?? ?為什么我們在使用 log4j 的同時還要引入 commons-logging.jar 呢,或者說不用 commons-logging.jar 可不可以,這兩者之間到底是怎么的一種關系呢?
?? ?我們都知道,真正的記錄日志的工具是 log4j 和 sun 公司提供的日志工具。
?? ?而 commons-logging 把這兩個記錄日志的工具重新封裝了一遍(Log4JLogger.java 和 Jdk14Logger.java),可以認為 org.apache.commons.logging.Log 是個傀儡,它只是提供了對外的統一接口。(實際上,在 org.apache.commons.logging.impl 包下,commons-logging 僅僅為我們封裝了 log4j 和 sun logger)。
?? ?因此我們只要能拿到 org.apache.commons.logging.Log,而不用關注到底使用的是 log4j 還是 sun logger。正如我們經常在項目中這樣寫:
?? ??? ?// MyClass 是我們自己寫的類,LogFactory 是一個專為提供 Log 的工廠(abstract class) ?
??? private static final Log logger = LogFactory.getLog(MyClass.class);
?? ?
? 而使用log4j記錄日志時,使用如下三個方法獲取logger:
??? Logger.getRootLogger();
??? Logger getLogger(Class clazz);
??? Logger getLogger(String name);
?? ?
?? 既然如此,我們向構建路徑加了 commons-logging.jar 和 log4j.jar 兩個 jar 包,那我們的應用程序到底使用的 log4j 還是 sun logger 呢?我們能不能認為由于加了 log4j.jar 包,就認為系統使用的就是 log4j 呢?事實上當然不是這樣的,那我還認為我正在使用 jdk 而認為系統使用的是 sun logger 呢。使用 Spring 的朋友可以在 web.xml 中看到如下 listener 片段:
?? ???? <listener> ?
?? ???????? <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> ?
?? ???? </listener> ?
?? ?這是由 Spring 為我們提供的實現了標準的 servlet api 中的 javax.servlet.ServletContextListener 接口,用于在 web 容器啟動時做一些初始化操作。
?? ?從Spring 的源碼,可以看到如下代碼:Log4jConfigurer.initLogging(location, refreshInterval); ?
?? ?找到 org.springframework.util.Log4jConfigurer,這正是 log4j 提供給我們的初始化日志的類。至此,我們終于明白了我們系統的的確確使用的是 log4j 的日志工具。
?? 可是問題又來了,org.apache.commons.logging.Log 和 org.apache.log4j.Logger 這兩個類,通過包名我們可以發現它們都是 apache 的項目,既然如下,為何要動如此大的動作搞兩個東西(指的是 commons-logging 和 log4j)出來呢?事實上,在 sun 開發 logger 前,apache 項目已經開發了功能強大的 log4j 日志工具,并向 sun 推薦將其納入到 jdk 的一部分,可是 sun 拒絕了 apache 的提議,sun 后來自己開發了一套記錄日志的工具。可是現在的開源項目都使用的是 log4j,log4j 已經成了事實上的標準,但由于又有一部分開發者在使用 sun logger,因此 apache 才推出 commons-logging,使得我們不必關注我們正在使用何種日志工具。
??
? ?
?? 下面我說明如何通過配置文件來組合commons-logging和log4j。
?? ??? ?配置文件內容很簡單,就指定一個日志實現類即可,下面是個示例文件:
?? ??? ?
?? ??? ?commons-logging.properties
?? ??? ?--------------------------------------------------------------------------------
?? ??? ?org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
?? ??? ?--------------------------------------------------------------------------------
?? ??? ?
?? ??? ?在使用Log4j作為日志工具的時候,commons-logging.properties的配置可以不要,在下面例子中,你可以嘗試刪除此文件,而不影響日志輸出。
轉載于:https://blog.51cto.com/zlfwmm/1610374
總結
以上是生活随笔為你收集整理的commons-logging和log4j的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CI中PHP写法规范(不断更新)
- 下一篇: WP8.1学习系列(第一章)——添加应用