java日志操作

Share

我们不管开发什么系统,通常情况下,都要求有日志,我现在写了个,希望大家提意见:


package com.util.log;

import java.util.Vector;
import java.sql.*;
import com.database.ConnectionManager;

/**
*
*

Title:日志处理类

*

Description: 将日志信息写入到数据库

*

Copyright: Copyright (c) 2005

*

Company: 自由鸟

* @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 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 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 copied.addElement(logCache.get(i));
}
logCache.clear(); //清除缓存数据
writeToDB(copied);
}
}//end synchronized

}catch(Exception e){
System.out.println(“LogUtil,e: “+e);
}
}

/**
*


* 类名: LogBean
* 描述: 用来缓存日志数据的类。一个对象代表一条日志记录
*

*/
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;
}//
}
}