[转]用JDK中提供的java.util.logging.*包创建Logger对象
2009-06-19 10:16
483 查看
转自:http://www.blogjava.net/xinwuhen/archive/2008/03/11/184591.html
作者:心无痕
由于项目中用到了Applet与Servlet之间(客户端用Applet、Server端用Servlet)的通信,要求:
1:>客户端与服务端必须出Log.
2:>浏览器在加载Applet时已有好多个JAR文件需要加载,故不想再附加Log4J对应的JAR包。
基于上面的要求,便想到了使用JDK自带的LOG输出功能,具体Logger对象的工厂类如下:
++++ 输出结果如下(注意内容是通过程序中定义的文件来存储的,在$USER_HOME/topo0.log中):++++
[2008-03-07 21:01:328, 000], SEVERE, com.quantanetwork.esm.logic.topo.TopoLogger,main 很严重哟:
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)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
作者:心无痕
由于项目中用到了Applet与Servlet之间(客户端用Applet、Server端用Servlet)的通信,要求:
1:>客户端与服务端必须出Log.
2:>浏览器在加载Applet时已有好多个JAR文件需要加载,故不想再附加Log4J对应的JAR包。
基于上面的要求,便想到了使用JDK自带的LOG输出功能,具体Logger对象的工厂类如下:
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; /** * 拓扑Logger。 * @author xinwuhen * */ public class TopoLogger { // Log文件的路径及格式:%h 代表用户主目录 %g 代表自动编号 private static final String logFile = "%h/topo%g.log"; // 写入到任何一个文件的最大字节数 private static final int limit = 5 * 1024; // 要使用的文件数 private static final int count = 20; // 指定 append 模式 private static final boolean append = true; // 默认LOG级别 private static final Level defaultLevel = Level.INFO; // Logger存储器 private static final HashMap<String, Logger> hmLogger = new HashMap<String, Logger>(); // 为对Logger存储器访问提供的同步锁对象 private static final Object syncLock = new Object(); /** * 此处是测试方法。 **/ public static void main(String[] args) { Logger logger = getLogger(null); // 此处用Null代表用本类(TopoLogger)的类名作为Logger的名称 try { System.out.println(Long.parseLong(null)); } catch(Exception ex) { TopoLogger.getLogger(null).log(Level.SEVERE, "很严重哟", ex); } } /** * 从Logger存储器取得Logger对象。 * @param strClassName * @return */ public static Logger getLogger(String strClassName) { Logger logger = null; synchronized (syncLock) { if (strClassName == null) { // 取当前Logger类默认的Logger对象 String strDefaultClassName = TopoLogger.class.getName(); logger = hmLogger.get(strDefaultClassName); if (logger == null) { logger = Logger.getLogger(strDefaultClassName); hmLogger.put(strDefaultClassName, logger); } } else { // 新生成一个指定名称的Logger对象 logger = hmLogger.get(strClassName); if (logger == null) { logger = Logger.getLogger(strClassName); hmLogger.put(strClassName, logger); } } } // 添加默认的文件处理句柄 logger.addHandler(getFileHandler()); return logger; } /** * 取默认的文件处理句柄。 * @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(); } /** * 根据指定格式转换时间。 * @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); } /** * 取例外对象的信息。 * @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; } } }
++++ 输出结果如下(注意内容是通过程序中定义的文件来存储的,在$USER_HOME/topo0.log中):++++
[2008-03-07 21:01:328, 000], SEVERE, com.quantanetwork.esm.logic.topo.TopoLogger,main 很严重哟:
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)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
相关文章推荐