正文

日志操作2006-06-21 13:39:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/ggbm/16084.html

分享到:

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

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

  }

阅读(2041) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册