概述 背景
在應用程序中添加日志記錄總的來說基於三個目的
監視代碼中變量的變化情況
周期性的記錄到文件中供其他應用進行統計分析工作
跟蹤代碼運行時軌跡
作為日後審計的依據
擔當集成開發環境中的調試器的作用
向文件或控制台打印代碼的調試信息
最普通的做法就是在代碼中嵌入許多的打印語句
這些打印語句可以輸出到控制台或文件中
比較好的做法就是構造一個日志操作類來封裝此類操作
而不是讓一系列的打印語句充斥了代碼的主體
Log
j簡介
在強調可重用組件開發的今天
除了自己從頭到尾開發一個可重用的日志操作類外
Apache為我們提供了一個強有力的日志操作包
Log
j
Log
j是Apache的一個開放源代碼項目
通過使用Log
j
我們可以控制日志信息輸送的目的地是控制台
文件
GUI組件
甚至是套接口服務器
NT的事件記錄器
UNIX Syslog守護進程等
我們也可以控制每一條日志的輸出格式
通過定義每一條日志信息的級別
我們能夠更加細致地控制日志的生成過程
最令人感興趣的就是
這些可以通過一個配置文件來靈活地進行配置
而不需要修改應用的代碼
此外
通過Log
j其他語言接口
您可以在C
C++
Net
PL/SQL程序中使用Log
j
其語法和用法與在Java程序中一樣
使得多語言分布式系統得到一個統一一致的日志組件模塊
而且
通過使用各種第三方擴展
您可以很方便地將Log
j集成到J
EE
JINI甚至是SNMP應用中
本文介紹的Log
j版本是
作者試圖通過一個簡單的客戶/服務器Java程序例子對比使用與不使用Log
j
的差別
並詳細講解了在實踐中最常使用Log
j的方法和步驟
在強調可重用組件開發的今天
相信Log
j將會給廣大的設計開發人員帶來方便
加入到Log
j的隊伍來吧!
一個簡單的例子 我們先來看一個簡單的例子
它是一個用Java實現的客戶/服務器網絡程序
剛開始我們不使用Log
j
而是使用了一系列的打印語句
然後我們將使用Log
j來實現它的日志功能
這樣
大家就可以清楚地比較出前後兩個代碼的差別
不使用Log
j
客戶程序
package log
j ;
import java
io
* ;
import
* ;
/**
*
* <p> Client Without Log
j </p>
* <p> Description: a sample with log
j</p>
* @version
*/
public class ClientWithoutLog
j {
/**
*
* @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
) ;
System
out
println (
info: Client socket:
+ client ) ;
in = client
getInputStream () ;
out = client
getOutputStream () ;
} catch ( IOException e ) {
System
out
println (
error: IOException :
+ e ) ;
System
exit (
) ;
}
try{
reader = new BufferedReader( new InputStreamReader ( in ) ) ;
writer = new PrintWriter ( new OutputStreamWriter ( out )
true ) ;
welcome = reader
readLine () ;
System
out
println (
debug: Server says:
+ welcome +
) ;
System
out
println (
debug: HELLO
) ;
writer
println (
HELLO
) ;
response = reader
readLine () ;
System
out
println (
debug: Server responds:
+ response +
) ;
System
out
println (
debug: HELP
) ;
writer
println (
HELP
) ;
response = reader
readLine () ;
System
out
println (
debug: Server responds:
+ response +
) ;
System
out
println (
debug: QUIT
) ;
writer
println (
QUIT
) ;
} catch ( IOException e ) {
System
out
println (
warn: IOException in client
in
readln()
) ;
System
out
println ( e ) ;
}
try{
Thread
sleep (
) ;
} catch ( Exception ignored ) {}
}
}
服務器程序
package log
j ;
import java
util
* ;
import java
io
* ;
import
* ;
/**
*
* <p> Server Without Log
j </p>
* <p> Description: a sample with log
j</p>
* @version
*/
public class ServerWithoutLog
j {
final static int SERVER_PORT =
; // this server
s port
/**
*
* @param args
*/
public static void main ( String args [] ) {
String clientRequest = null;
BufferedReader reader = null;
PrintWriter writer = null;
ServerSocket server = null;
Socket socket = null;
InputStream in = null;
OutputStream out = null;
try {
server = new ServerSocket ( SERVER_PORT ) ;
System
out
println (
info: ServerSocket before accept:
+ server ) ;
System
out
println (
info: Java server without log
j
on
line!
) ;
// wait for client
s connection
socket = server
accept () ;
System
out
println (
info: ServerSocket after accept:
+ server ) ;
in = socket
getInputStream () ;
out = socket
getOutputStream () ;
} catch ( IOException e ) {
System
out
println(
error: Server constructor IOException:
+ e ) ;
System
exit (
) ;
}
reader = new BufferedReader ( new InputStreamReader ( in ) ) ;
writer = new PrintWriter ( new OutputStreamWriter ( out )
true ) ;
// send welcome string to client
writer
println (
Java server without log
j
+ new Date () ) ;
while ( true ) {
try {
// read from client
clientRequest = reader
readLine () ;
System
out
println (
debug: Client says:
+ clientRequest ) ;
if ( clientRequest
startsWith (
HELP
) ) {
System
out
println (
debug: OK!
) ;
writer
println (
Vocabulary: HELP QUIT
) ;
}
else {
if ( clientRequest
startsWith (
QUIT
) ) {
System
out
println (
debug: OK!
) ;
System
exit (
) ;
}
else{
System
out
println (
warn: Command
+
clientRequest +
not understood
) ;
writer
println (
Command
+ clientRequest
+
not understood
) ;
}
}
} catch ( IOException e ) {
System
out
println (
error: IOException in Server
+ e ) ;
System
exit (
) ;
}
}
}
}
遷移到Log
j
客戶程序
package log
j ;
import java
io
* ;
import
* ;
// add for log
j: import some package
import org
apache
log
j
PropertyConfigurator ;
import org
apache
log
j
Logger ;
import org
apache
log
j
Level ;
/**
*
* <p> Client With Log
j </p>
* <p> Description: a sample with log
j<
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28526.html