将Log日志通过Hibernate保存到数据库中

        为了记录客户操作软件的轨迹,我想将客户的操作记录有选择的保存起来。(防止到时他死不认账 ),最好是永久的保存,所以就想到保存到用户数据库(可能是不太理想,会使用用户数据库变得很大)。
       本来程序中就用到了Log4j进行日志输入,但是只用到了文件和控制台两种方式,一查还真有保存到数据库中的Appender---JDBCAppender。可是它只能是通过JDBC连接向数据库插入语句,我的程序的所有和数据库打交道的都是Hibernate。总不能为了这个功能再单独搞个链接吧?不理想。
       把JDBCApppender的源码下来,折腾一阵子。好象有点思路了。
       主要是
        extends org.apache.log4j.AppenderSkeleton
        implements org.apache.log4j.Appender
       然后实现org.apache.log4j.AppenderSkeleton这个抽象类中的三个方法就应该可以。

       append(LoggingEvent event)   //这个应该就是实际向Log中加入日志的方法了
       void close()                                  //关闭资源吧
       boolean requiresLayout()         //日志输出格式?
   
       最终写了一个HiberanteAppender
package  cn.com.kylinsoft.platform.utils;

import  java.util.Calendar;

import  org.apache.log4j.spi.LoggingEvent;
import  org.hibernate.Session;
import  org.hibernate.Transaction;

import  cn.com.kylinsoft.platform.bean.OperateLog;
import  cn.com.kylinsoft.platform.utils.hibernate.HibernateUtil;

public   class  HibernateAppender  extends  org.apache.log4j.AppenderSkeleton
        
implements  org.apache.log4j.Appender  {
    
private Session session = null;

    
/**
     * 执行保存数据库操作
     * 
@param operateLog
     
*/

    
protected void execute(OperateLog operateLog) {
        
try {
            session 
= HibernateUtil.getSession();
            Transaction tx 
= session.beginTransaction();
            session.saveOrUpdate(operateLog);
            tx.commit();
        }
 catch (Exception e) {
            System.err.println(
"can`t save log " + e);
        }
 finally {
            
if (session != null)
                session.close();
        }

    }


    @Override
    
protected void append(LoggingEvent event) {
        OperateLog log 
= new OperateLog();
        log.setLogDate(Calendar.getInstance().getTime());
        log.setMes(String.valueOf(event.getRenderedMessage()));
        log.setStackTrace(event.getThrowableInformation()
                
+ event.getThreadName());
        execute(log);
    }


    @Override
    
public void close() {
        
this.closed=true;
    }


    @Override
    
public boolean requiresLayout() {
        
return true;
    }

}


HibernateUtil是操作Hibernate的类。其中要有一个getSession方法,
还有一个 OperateLog 类。这个就是和数据库对应的实体类了
package  cn.com.kylinsoft.platform.bean;

import  java.io.Serializable;
import  java.util.Date;

public   class  OperateLog  implements  Serializable  {

    
private Integer id;

    
private String userId;

    
private String mes;

    
private Date logDate;

    
private String stackTrace;

    
public OperateLog() {

    }


    
public void setLogDate(Date logDate) {
        
this.logDate = logDate;
    }


    
public Date getLogDate() {
        
return logDate;
    }


    
public Integer getId() {
        
return id;
    }


    
public void setId(Integer id) {
        
this.id = id;
    }


    
public String getMes() {
        
return mes;
    }


    
public void setMes(String mes) {
        
this.mes = mes;
    }


    
public String getStackTrace() {
        
return stackTrace;
    }


    
public void setStackTrace(String stackTrace) {
        
this.stackTrace = stackTrace;
    }


    
public String getUserId() {
        
return userId;
    }


    
public void setUserId(String userId) {
        
this.userId = userId;
    }


}


至于hbm.xml和数据库表的结构根据这个类就可以写出来了。

差点忘了Log4j.xml文件中加入这一段

     < appender  name ="JDBC"  class ="cn.com.kylinsoft.platform.utils.HibernateAppender" >
        
<!--  这个Layout 应该没有什么作用,因为存入数据库的格式是固定的  -->
        
< layout  class ="org.apache.log4j.PatternLayout" >
            
< param  name ="ConversionPattern"
                value
="[%d{yyyy-MM-dd HH:mm:ss}] %c : [%-5p] %x - %m%n"   />
        
</ layout >
    
</ appender >


 主要缺点:
    1、日志的格式固定的,不能改变;
    2、日志表的记录,如果太大就不好处理了,得想个办法在超过一定记录数后清除,或转存到其他的表中。

如果谁有好的方法解决上面的问题,请联系wfn_libo@163.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值