Log4j是什麼、有什麼
Log4j是Apache的一個開放源代碼項目,通過使用Log4j,可以控制日志資訊輸送的目的地是控制台、檔案、GUI元件、甚至是套接口伺服器、NT的事件記錄器等;也可以控制每一條日志的輸出格式;通過定義每一條日志資訊的級别,能夠更加細緻地控制日志的生成過程。這些可以通過一個配置檔案來靈活地進行配置,而不需要修改應用的代碼。
一個開源的、輕量級的、用于日志管理的架構
Log4j由三個重要的元件構成: 日志資訊的輸出格式,日志資訊的優先級, 日 志資訊的輸出目的地。日志資訊的優先級用來指定這條日志資訊的重要程度;日志資訊的輸出目的地指定了日志将列印到控制台還是檔案中;而輸出格式則控制了日志資訊的顯示内容 。
主要用來進行日志記錄的管理,包括對日志輸出的目的地,輸出的資訊級别和輸出的格式等。
Logger被指定為實體,Logger的名字是大小寫敏感的,它們遵循以下的命名文法規則:用“.”來劃分層次級别,如:cn.javass.test
OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。Log4j建議隻使用四個級别,優先級從高到低分别是ERROR、WARN、INFO、DEBUG。通過在這裡定義的級别,可以控制到應用程式中相應級别的日志資訊的開關。
1:級别的控制,就是隻要大于等于指定的控制級别,就可以輸出
2:如果有多個logger,都可以比對輸出,則每個logger都産生輸出,其中根logger比對所有的輸出;而級别控制來源于路徑最詳細的logger。
java代碼:
Log4j允許日志請求被輸出到多個輸出源。用Log4j的話說,一個輸出源被稱做一個Appender 。
一個logger可以設定超過一個的appender。
布局就是指輸出資訊的格式。在Log4j中稱作Layout
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志資訊的級别和資訊字元串),
org.apache.log4j.TTCCLayout(包含日志産生的時間、線程、類别等等資訊)
%m 輸出代碼中指定的消息
%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啟動到輸出該log資訊耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出産生該日志事件的線程名
%n 輸出一個回車換行符,Windows平台為“\r\n”,Unix平台為“\n”
%d 輸出日志時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)
Log4j有兩種配置方式,一種是xml格式,一種是properties格式。都是放置到classpath下面。預設名稱分别是:log4j.xml和log4j.properties
每個Appender都要引用自己的Layout。
每個Logger都可以指定一個級别,同時引用多個Appender;而一個Appender也同時可以被多個Logger引用。
首先要注意,log4j.xml優先于log4j.properties,如果同時存在log4j.xml和log4j.properites,以log4j.xml為準。
在log4j.properties裡,控制級别的時候,隻能列印出大于指定級别的所有資訊;但是在log4j.xml中可以通過filter來完成過濾:典型的引用是隻列印出某種級别的資訊。
可以通過logger的additivity=“false”屬性,來設定多個logger是否重複輸出同一條資訊
為什麼不是直接logger.debug(“debug:“+name);呢?
在配置檔案中雖然可以使用控制級别為比debug級别更高的級别,而不輸出debug資訊;但是,這裡的字元串連接配接操作仍然會影響運作效率;如果先判斷目前logger的級别,如果級别不合适的話,連這句字元串連接配接都可以不做了。
在java中使用log4j時,我們可以使用它的eclipse插件log4e。它的官方網址是:http://log4e.jayefem.de/,分為商業版本和免費版本。我們隻需要使用其免費版本,就可以極大的幫我們提高開發效率。比如:在一個類中聲明一個logger;幫我們寫麻煩的logger.isDebugEnabled();在一個方法開始的時候列印所有的參數;輸出一個變量等等。
除了使用log4j進行日志輸出之外,我們還可以使用jdk内置的日志系統。它位于java.util.logging包下,是以不需要引用額外的jar包。其基本概念與log4j大同小異,我們可以類比的學習。
其配置檔案位于jdk安裝目錄下的/jre/lib/logging.properties。
請同學們觀察配置檔案,自己找到我們在log4j裡找的Appender、Layout、級别和Logger,以及它們的關系。
簡單日記門面(simple logging Facade for java)SLF4J是為各種loging APIs提供一個簡單統一的接口,進而使得最終使用者能夠在部署的時候配置自己希望的loging APIs實作。
準确的說,slf4j并不是一種具體的日志系統,而是一個使用者日志系統的facade,允許使用者在部署最終應用時友善的變更其日志系統。
在系統開發中,統一按照slf4j的API進行開發,在部署時,選擇不同的日志系統包,即可自動轉換到不同的日志系統上。比如:選擇JDK自帶的日志系統,則隻需要将slf4j-api-1.5.10.jar和slf4j-jdk14-1.5.10.jar放置到classpath中即可,如果中途無法忍受JDK自帶的日志系統了,想換成log4j的日志系統,僅需要用slf4j-log4j12-1.5.10.jar替換slf4j-jdk14-1.5.10.jar即可( 當然也需要log4j的jar及 配置檔案)

大家應該還記得,在log4j中,為了提高運作效率,往往在輸出資訊之前,還要進行級别判斷,以避免無效的字元串連接配接操作。如下:
if (logger.isDebugEnabled()){
logger.debug(“debug:“+name);
}
slf4j巧妙的解決了這個問題:先傳入帶有占位符的字元串,同時把其他參數傳入,在slf4j的内容部實作中,如果級别合适再去用傳入的參數去替換字元串中的占位符,否則不用執行。
logger.info("{} is {}", new String[]{“x",“y"});
轉載位址:http://sishuok.com/forum/blogPost/list/0/3740.html#8838
本文轉自027ryan 51CTO部落格,原文連結:http://blog.51cto.com/ucode/1790136,如需轉載請自行聯系原作者