我们不管开发什么系统,通常情况下,都要求有日志,我现在写了个,希望大家提意见: package com.util.log; import java.util.Vector;import java.sql.*;import com.database.ConnectionManager; /** * * <p>Title:日志处理类 </p> * <p>Description: 将日志信息写入到数据库</p> * <p>Copyright: Copyright (c) 2005</p> * <p>Company: 自由鸟</p> * @author XXX Programer * @version 1.0 */ public class LogUtil { /** * 用于缓存系统日志。当这个Vector对象的大小达到一定的值时,系统把这个缓存里的 * 数据一次性写入数据库。这个集合对象里每个元素都是一个LogBean对象 */ private static Vector logCache = new Vector(); /** * 缓存容量 * 当缓存里面的数据条数(即logCache对象的大小)达到这个值时,系统把缓存里的数据 * 写入数据库 */ private static final int CACHE_SIZE = 20; //XX条记录写入一次 /** * 把数据集里的数据写入到数据库 * @param datas 数据集合。里面每个元素都是一条数据(LogBean对象) */ private static void writeToDB(Vector datas){ Connection conn = null; PreparedStatement pstmt = null; try{ conn = ConnectionManager.getConnection(); String sql = "insert into lmzwap.WAP_MANAGE_LOG (USER_NAME, LOG_TIME, CLIENT_IP, OPERATE_TYPE, OPERATE_DESC) " +" values(?,NOW(),?,?,?)"; pstmt = conn.prepareStatement(sql); LogBean logBean; //System.out.println("---------------writeToDB,datas.size(): "+datas.size()); for(int i=0;i<datas.size();i++){ logBean = (LogBean)datas.get(i); pstmt.setString(1,logBean.user_name); pstmt.setString(2,logBean.client_ip); pstmt.setString(3,String.valueOf(logBean.operateTypeID)); pstmt.setString(4,logBean.operateTypeDesc); pstmt.addBatch(); }//end for i pstmt.executeBatch(); //执行批处理 }catch(Exception e){ System.out.println("===============批处理写入日志失败,e: "+e); }finally{ if(pstmt!=null) try{ pstmt.close(); }catch(Exception e1){} if(conn!=null) try{ conn.close(); }catch(Exception e1){} } } /** * 把系统日志缓存里的数据写入数据库,不论缓存里有多少条记录。这个方法一般用在 * 用户从系统退出时时,把缓存里的数据写入数据库,而不管缓存里的数据条数是否达到 * 缓存容量 */ public static void writeToDB(){ Vector copied = null; synchronized(logCache){ //从缓存取得数据: copied = new Vector(logCache.size()); for(int i=0;i<logCache.size();i++){ copied.addElement(logCache.get(i)); } logCache.clear(); //清除缓存数据 }//end synchronized writeToDB(copied); } /** * 记录系统日志。调用这个方法只是把日志内容写进缓存,并不一定立即写入数据库; * 当缓存里的日志数量达到一定程度时,再一次性写入数据库 * @param request 客户端发过来的request请求,里面包含了客户端端IP的信息, * 通过这个请求可得到session,在session里可得到操作员工ID, * 操作员工姓名等资料 * @param operateTypeID: 操作类型ID * @param operateTypeDesc: 操作类型描述 * @param operateDetail: 操作的具体内容的描述 */ public static void writeLog(String user_name,String client_ip, char operateTypeID,String operateTypeDesc) { try{ //Timestamp time = new Timestamp(System.currentTimeMillis()); //操作时间 LogBean bean = new LogBean(user_name,client_ip,operateTypeID,operateTypeDesc); synchronized(logCache){ logCache.addElement(bean); //向缓存加入数据 //如果缓存里的数据达到了缓存容量时,向数据库写入数据: if(logCache.size()>=CACHE_SIZE){ //从缓存取得数据: Vector copied = new Vector(logCache.size()); for(int i=0;i<logCache.size();i++){ copied.addElement(logCache.get(i)); } logCache.clear(); //清除缓存数据 writeToDB(copied); } }//end synchronized }catch(Exception e){ System.out.println("LogUtil,e: "+e); } } /** * <pre> * 类名: LogBean * 描述: 用来缓存日志数据的类。一个对象代表一条日志记录 * </pre> */ private static class LogBean{ String user_name; String client_ip; char operateTypeID; String operateTypeDesc; public LogBean(String user_name,String client_ip, char operateTypeID,String operateTypeDesc){ this.user_name = user_name; this.client_ip = client_ip; this.operateTypeID = operateTypeID; this.operateTypeDesc = operateTypeDesc; }// } }

评论