?? log4j_usage_detail.txt
字號:
常見的日志實現及其比較
目前常見的基于 Java 的日志實現有 Apache Log4j、Jakarta commons logging、Java Logging APIs 包和 Apache Excalibur LogKit 等。這些日志實現的介紹如下:
Apache Log4j
Log4j 最早可追溯至 1996 年初的 EU SEMPER(歐洲安全電子市場)項目,經過數次優化和改進,該 API 曾作為 IBM alphaWorks 的一個項目按 IBM 公共許可證分發,由開放源碼權威機構認證。現在,Log4j 已經成為 Apache Logging Service 的項目之一,在 Apache Software License 下分發。有關 Apache Log4j 的更多信息,請訪問 Apache Log4j 的主頁,或 IBM developerWorks 文章:Log4j delivers control over logging。
Jakarta commons logging
Jakarta commons logging (JCL) 是 Apache Jakarta 項目的 commons 子項目的一個組件,其是應用程序和底層的具體日志實現之間的接口。基于 JCL 的統一接口,開發人員可以選擇不同的日志實現作為底層的日志基礎,而不影響上層的應用程序。同時,JCL 中也默認提供了兩個基本的簡單日志實現:NoOpLog 和 SimpleLog。如果沒有指定底層的日志實現類,應用程序將默認調用 SimpleLog。有關 Jakarta commons logging 的更多信息,請訪問 Jakarta commons logging 的主頁。
Java Logging APIs
從 J2SE 1.4 開始,Java 2 SDK 中開始提供了日志功能,包含在 java.util.logging 包中。有關 Java Logging APIs 的更多信息,請查閱Java 2 JDK 文檔或 Java Logging APIs的主頁。
Apache Excalibur LogKit
LogKit 最早曾是 Apache Avalon 項目的組成部分,隨著項目的發展與成熟,Avalon 被拆分為多個項目。LogKit 被歸入其中一個分支-Apache Excalibur 項目中。有關Apache Excalibur LogKit的更多信息,請訪問 Apache Excalibur LogKit 的主頁。
常見日志實現的比較
以上四種常見的日志實現各有所長,在實際開發過程中,需要分析應用程序的具體情況,選擇適合項目開發的日志實現。本文通過分析 Apache Log4j、Jakarta commons logging、Java Logging APIs 和 Apache Excalibur LogKit 的優缺點,列舉了一些常用的開發實踐經驗。
1) 因為多年的發展和改進,Apache Log4j 具有完善的功能和豐富的特性,也成為了基于 Java 的日志實現框架的事實標準。但由于 Log4j 是 Apache 開放源代碼項目,所以,Apache Log4j 不太適合項目開發對開源庫的使用有一定限制的情況。
2) JCL 為所有底層的日志實現提供了一個統一的接口,但其自身實現的日志功能較弱(只有簡單的 NoOpLog 和 SimpleLog),所以通常需要和其他具體的日志實現結合使用。JCL 適合項目開發過程中不能決定采用哪個具體日志實現的情況,因為 JCL 的特性保證了不用修改代碼即可以完成底層日志實現的更換。但實際開發中,需要更換底層日志實現的情況較少,且采用 JCL 所引入的開發成本并未產生新的日志特性,因此選用 JCL 之前建議仔細評估。
3) Java Logging APIs 具有和 Apache Log4j 類似的功能,但不及后者成熟,日志特性也沒有后者豐富,所以,應用場景也不如后者廣泛。
4) Apache Excalibur LogKit 與另外幾種日志實現的最大區別在于其可以輸出多項日志信息,而不僅僅是輸出一行日志信息,從而便于將日志輸出直接插入到數據庫中。
watson Guo 注1:現在J2EE中更多的日志用法是使用JCL接口,連后使用log4j作為實現。這樣避免了log4j.properties在java程序中的指定,而只需要放到yrapp.war/web-info/classes/下。 你可以發現在appfuse,springside,還有其他開源的j2ee項目中,幾乎都是這么做的。。
watson Guo 注2:log4j問題:當war跑在jboss,weblogic,websphere里面時,應用服務器的log4j.xml會覆蓋應用的日志配置。
此時要想war的日志配置起作用,有2各辦法:
(1)。修改jboss/conf/log4j.xml使之符合自己的要求。(2)直接在應用classpath/下建立jboss-web.xml 和 log4j.xml具體可網上查。
惡性的是在windows下面RollFileAppender是有問題的,日志的文件編號出問題。估計是和緩存大小有關系,但是不影響使用。 。
。在linux/unxi下沒問題。
//////////////////////////////////////////////////////////
日志的配置
設置日志時使用的格式保留符號有:c,C,d,F,l,L,m,M,n,p,r,t,x,X,% 等等
C: 輸出觸發日志事件的文件的類名 輸出形如:包名.類名
c: 輸出觸發日志事件的文件的文件名 輸出形如: 文件名
d: 觸發日志事件的日期
F: 觸發日志的文件名
l: 觸發日志事件的文件及行數信息 輸出形如:包名.類名.方法名(文件名 行數)
L: 觸發日志事件的文件行數
m: 輸出系統設定的日志信息
M: 輸出觸發日志事件的方法名
n: 日志輸出時換行 使用形如:"\n"or"\r\n
p: 日志事件的優先級別
r: 系統運行到觸發日志事件之間的時間消耗(毫秒)
t: 觸發日志事件的線程
x: 輸出觸發日志事件的線程的NDC (nested diagnostic context):線程互斥時用
X: 輸出觸發日志事件的線程的MDC (mapped diagnostic context)使用形如:
%X{clientNum}clientNum 為mapKey
%: 格式字符的確認校驗符號 在每個格式符號前使用
輸出的列寬設定:
格式修飾符 左調整 最小列寬 最大列寬 說明
%20c false 20 none 如果輸出少于20字符,左邊補空格
%-20c true 20 none 如果輸出少于20字符,右邊補空格
%.30c NA none 30 如果輸出大于30從左開頭截去
%20.30c false 20 30 輸出字符少于20,左補空格;多于30,左開頭截去
%-20.30c true 20 30 輸出字符少于20,右補空格;多于30,左開頭截去
使用例子:
--------------------------------------------------------------------------------------------------------
類名:"org.apache.xyz.SomeClass" %C{1} 輸出 "SomeClass"
%d{dd MMM yyyy HH:mm:ss,SSS}
(格式未指定時使用 ISO8601格式標準"YYYY-mm-dd HH:mm:ss,SSS" ) --------------------------------------------------------------------------------------------------------
[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
[DEBUG] 2002-11-12 12:00:57,376 method:log.Untitled1.main(Untitled1.java:38)
tryOutput
--------------------------------------------------------------------------------------------------------
[%d{HH:mm:ss}] %p (%c %L) %x - %m%n
[11:36:11] INFO (try.java 22) - hello
--------------------------------------------------------------------------------------------------------
[%d] %p (%c %l) %x - %m%n
[2003-08-29 11:37:05,662] INFO (try.java log.Untitled1.main(Untitled1.java:22))
- hello
--------------------------------------------------------------------------------------------------------
{%d}%p (%C %n %l) %x - %m %M%n
{2003-08-29 11:40:29,585} INFO (log.Untitled1
log.Untitled1.main(Untitled1.java:38) ) - tryOutput main
注:
1.格式保留符號使用時,每個前面都要加%號,兩個%號則輸出一個%
2.格式設定時,若使用到非保留符號或保留符號前未加%,則視為一般子符(串)輸出,包括空格,空行
3.使用保留符號中的大寫符號時,需考慮時間影響.
日志的級別:
常用的日志級別包括:
debug:最常使用的日志級別.
info:一些重要信息的提示級別.
error:重大錯誤級別.
fatal:致命錯誤級別
all:所有的日志都顯示級別.
warn:警告錯誤級別.
off:所有日志都不顯示級別.
設置日志時使用的格式保留符號有:c,C,d,F,l,L,m,M,n,p,r,t,x,X,% 等等
C: 輸出觸發日志事件的文件的類名 輸出形如:包名.類名
c: 輸出觸發日志事件的文件的文件名 輸出形如: 文件名
d: 觸發日志事件的日期
F: 觸發日志的文件名
l: 觸發日志事件的文件及行數信息 輸出形如:包名.類名.方法名(文件名 行數)
L: 觸發日志事件的文件行數
m: 輸出系統設定的日志信息
M: 輸出觸發日志事件的方法名
n: 日志輸出時換行 使用形如:"\n"or"\r\n
p: 日志事件的優先級別
r: 系統運行到觸發日志事件之間的時間消耗(毫秒)
t: 觸發日志事件的線程
x: 輸出觸發日志事件的線程的NDC (nested diagnostic context):線程互斥時用
X: 輸出觸發日志事件的線程的MDC (mapped diagnostic context)使用形如:
%X{clientNum}clientNum 為mapKey
%: 格式字符的確認校驗符號 在每個格式符號前使用
輸出的列寬設定:
格式修飾符 左調整 最小列寬 最大列寬 說明
%20c false 20 none 如果輸出少于20字符,左邊補空格
%-20c true 20 none 如果輸出少于20字符,右邊補空格
%.30c NA none 30 如果輸出大于30從左開頭截去
%20.30c false 20 30輸出字符少于20,左補空格;多于30,左開頭截去
%-20.30c true 20 30 輸出字符少于20,右補空格;多于30,左開頭截去
使用例子:
--------------------------------------------------------------------------------------------------------
類名:"org.apache.xyz.SomeClass" %C{1} 輸出 "SomeClass"
%d{dd MMM yyyy HH:mm:ss,SSS}
(格式未指定時使用 ISO8601格式標準"YYYY-mm-dd HH:mm:ss,SSS" ) --------------------------------------------------------------------------------------------------------
[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
[DEBUG] 2002-11-12 12:00:57,376 method:log.Untitled1.main(Untitled1.java:38)
tryOutput
--------------------------------------------------------------------------------------------------------
[%d{HH:mm:ss}] %p (%c %L) %x - %m%n
[11:36:11] INFO (try.java 22) - hello
--------------------------------------------------------------------------------------------------------
[%d] %p (%c %l) %x - %m%n
[2003-08-29 11:37:05,662] INFO (try.java log.Untitled1.main(Untitled1.java:22))
- hello
--------------------------------------------------------------------------------------------------------
{%d}%p (%C %n %l) %x - %m %M%n
{2003-08-29 11:40:29,585} INFO (log.Untitled1
log.Untitled1.main(Untitled1.java:38) ) - tryOutput main
注:1.格式保留符號使用時,每個前面都要加%號,兩個%號則輸出一個%
2.格式設定時,若使用到非保留符號或保留符號前未加%,則視為一般子符(串)輸出,包括空格,空行
3.使用保留符號中的大寫符號時,需考慮時間影響.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
在應用程序中添加日志記錄總的來說基于三個目的:監視代碼中變量的變化情況,周期性的記錄到文件中供其他應用進行統計分析工作;跟蹤代碼運行時軌跡,作為日后審計的依據;擔當集成開發環境中的調試器的作用,向文件或控制臺打印代碼的調試信息。
最普通的做法就是在代碼中嵌入許多的打印語句,這些打印語句可以輸出到控制臺或文件中,比較好的做法就是構造一個日志操作類來封裝此類操作,而不是讓一系列的打印語句充斥了代碼的主體。
1.2. Log4j簡介
在強調可重用組件開發的今天,除了自己從頭到尾開發一個可重用的日志操作類外,Apache為我們提供了一個強有力的日志操作包-Log4j。
Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。
此外,通過Log4j其他語言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其語法和用法與在Java程序中一樣,使得多語言分布式系統得到一個統一一致的日志組件模塊。而且,通過使用各種第三方擴展,您可以很方便地將Log4j集成到J2EE、JINI甚至是SNMP應用中。
本文介紹的Log4j版本是1.2.3。作者試圖通過一個簡單的客戶/服務器Java程序例子對比使用與不使用Log4j 1.2.3的差別,并詳細講解了在實踐中最常使用Log4j的方法和步驟。在強調可重用組件開發的今天,相信Log4j將會給廣大的設計開發人員帶來方便。加入到Log4j的隊伍來吧!
一個簡單的例子
我們先來看一個簡單的例子,它是一個用Java實現的客戶/服務器網絡程序。剛開始我們不使用Log4j,而是使用了一系列的打印語句,然后我們將使用Log4j來實現它的日志功能。這樣,大家就可以清楚地比較出前后兩個代碼的差別。
2.1. 不使用Log4j
2.1.1. 客戶程序
package log4j ;
import java.io.* ;
import java.net.* ;
/**
*
* <p> Client Without Log4j </p>
* <p> Description: a sample with log4j</p>
* @version 1.0
*/
public class ClientWithoutLog4j {
/**
*
* @param args
*/
public static void main ( String args [] ) {
String welcome = null;
String response = null;
BufferedReader reader = null;
PrintWriter writer = null;
InputStream in = null;
OutputStream out = null;
Socket client = null;
try {
client = new Socket ( "localhost", 8001 ) ;
System.out.println ( "info: Client socket: " + client ) ;
in = client.getInputStream () ;
out = client.getOutputStream () ;
} catch ( IOException e ) {
System.out.println ( "error: IOException : " + e ) ;
System.exit ( 0 ) ;
}
try{
reader = new BufferedReader( new InputStreamReader ( in ) ) ;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -