用JDK中提供的java.util.logging.*包創(chuàng)建Logger對(duì)象----原創(chuàng)
由于項(xiàng)目中用到了Applet與Servlet之間(客戶(hù)端用Applet、Server端用Servlet)的通信,要求:
1:>客戶(hù)端與服務(wù)端必須出Log.
2:>瀏覽器在加載Applet時(shí)已有好多個(gè)JAR文件需要加載,故不想再附加Log4J對(duì)應(yīng)的JAR包。
基于上面的要求,便想到了使用JDK自帶的LOG輸出功能,具體Logger對(duì)象的工廠(chǎng)類(lèi)如下:
package com.quantanetwork.esm.logic.topo;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
/**
* 拓?fù)銵ogger。
* @author xinwuhen
*
*/
public class TopoLogger {
// Log文件的路徑及格式:%h 代表用戶(hù)主目錄 %g 代表自動(dòng)編號(hào)
private static final String logFile = "%h/topo%g.log";
// 寫(xiě)入到任何一個(gè)文件的最大字節(jié)數(shù)
private static final int limit = 5 * 1024;
// 要使用的文件數(shù)
private static final int count = 20;
// 指定 append 模式
private static final boolean append = true;
// 默認(rèn)LOG級(jí)別
private static final Level defaultLevel = Level.INFO;
// Logger存儲(chǔ)器
private static final HashMap<String, Logger> hmLogger = new HashMap<String, Logger>();
// 為對(duì)Logger存儲(chǔ)器訪(fǎng)問(wèn)提供的同步鎖對(duì)象
private static final Object syncLock = new Object();
/**
* 此處是測(cè)試方法。
**/
public static void main(String[] args) {
Logger logger = getLogger(null); // 此處用Null代表用本類(lèi)(TopoLogger)的類(lèi)名作為L(zhǎng)ogger的名稱(chēng)
try {
System.out.println(Long.parseLong(null));
} catch(Exception ex) {
TopoLogger.getLogger(null).log(Level.SEVERE, "很?chē)?yán)重喲", ex);
}
}
/**
* 從Logger存儲(chǔ)器取得Logger對(duì)象。
* @param strClassName
* @return
*/
public static Logger getLogger(String strClassName) {
Logger logger = null;
synchronized (syncLock) {
if (strClassName == null) { // 取當(dāng)前Logger類(lèi)默認(rèn)的Logger對(duì)象
String strDefaultClassName = TopoLogger.class.getName();
logger = hmLogger.get(strDefaultClassName);
if (logger == null) {
logger = Logger.getLogger(strDefaultClassName);
hmLogger.put(strDefaultClassName, logger);
}
} else { // 新生成一個(gè)指定名稱(chēng)的Logger對(duì)象
logger = hmLogger.get(strClassName);
if (logger == null) {
logger = Logger.getLogger(strClassName);
hmLogger.put(strClassName, logger);
}
}
}
// 添加默認(rèn)的文件處理句柄
logger.addHandler(getFileHandler());
return logger;
}
/**
* 取默認(rèn)的文件處理句柄。
* @return
*/
private static FileHandler getFileHandler() {
FileHandler fileHandler = null;
try {
fileHandler = new FileHandler(logFile, limit, count, append);
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (fileHandler != null) {
fileHandler.setLevel(defaultLevel);
fileHandler.setFormatter(new TopoLoggerFormatter());
}
return fileHandler;
}
/**
* Logger格式化處理器。
*
* @author xinwuhen
*/
final static class TopoLoggerFormatter extends Formatter {
@Override
public String format(LogRecord record) {
StringBuffer strOutput = new StringBuffer();
strOutput.append("[");
strOutput.append(getFormattedTime(record.getMillis(), "yyyy-MM-dd HH:mm:SS, sss"));
strOutput.append("], ");
strOutput.append(record.getLevel());
strOutput.append(", ");
strOutput.append(record.getSourceClassName());
strOutput.append(",");
strOutput.append(record.getSourceMethodName());
strOutput.append(" ");
strOutput.append(record.getMessage());
strOutput.append(":");
strOutput.append(System.getProperty("line.separator"));
Throwable throwAble = record.getThrown();
if (throwAble != null) {
strOutput.append(getThrowAbleInfo(throwAble));
}
return strOutput.toString();
}
/**
* 根據(jù)指定格式轉(zhuǎn)換時(shí)間。
* @param lngMillTimes
* @param strTimeFormat
* @return
*/
private String getFormattedTime(long lngMillTimes, String strTimeFormat) {
Date lvDate = new Date();
lvDate.setTime(lngMillTimes);
SimpleDateFormat lvFormat = new SimpleDateFormat(strTimeFormat, Locale.CHINA);
return lvFormat.format(lvDate);
}
/**
* 取例外對(duì)象的信息。
* @param throwAble
* @return
*/
private String getThrowAbleInfo(Throwable throwAble) {
String throwAbleInfo = "";
StackTraceElement[] ste = throwAble.getStackTrace();
if (ste != null) {
final String strLineSeparator = System.getProperty("line.separator");
StringBuffer sbStackTraceEle = new StringBuffer();
for (StackTraceElement stackTraceElement : ste) {
sbStackTraceEle.append(" at ");
sbStackTraceEle.append(stackTraceElement.toString());
sbStackTraceEle.append(strLineSeparator);
}
throwAbleInfo = throwAble.toString() + strLineSeparator + sbStackTraceEle;
}
return throwAbleInfo;
}
}
}
++++ 輸出結(jié)果如下(注意內(nèi)容是通過(guò)程序中定義的文件來(lái)存儲(chǔ)的,在$USER_HOME/topo0.log中):++++
[2008-03-07 21:01:328, 000], SEVERE, com.quantanetwork.esm.logic.topo.TopoLogger,main 很?chē)?yán)重喲:
java.lang.NumberFormatException: null
at java.lang.Long.parseLong(Long.java:372)
at java.lang.Long.parseLong(Long.java:461)
at com.quantanetwork.esm.logic.topo.TopoLogger.main(TopoLogger.java:40)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
以上內(nèi)容拋磚引玉,望大家有其它輸出方式的更好實(shí)現(xiàn)。。。。。。另外,本人博客中的“JAVA技術(shù)文檔”鏈接分類(lèi)也有對(duì)JDK的Logger的描述,可以參見(jiàn)該文檔互相學(xué)習(xí)。。。。。謝謝!!!
posted on 2008-03-07 21:00 心無(wú)痕 閱讀(3237) 評(píng)論(1) 編輯 收藏 所屬分類(lèi): JAVA