为了记录客户操作软件的轨迹,我想将客户的操作记录有选择的保存起来。(防止到时他死不认账
),最好是永久的保存,所以就想到保存到用户数据库(可能是不太理想,会使用用户数据库变得很大)。
本来程序中就用到了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

本来程序中就用到了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






















































HibernateUtil是操作Hibernate的类。其中要有一个getSession方法,
还有一个OperateLog 类。这个就是和数据库对应的实体类了































































至于hbm.xml和数据库表的结构根据这个类就可以写出来了。
差点忘了Log4j.xml文件中加入这一段








主要缺点:
1、日志的格式固定的,不能改变;
2、日志表的记录,如果太大就不好处理了,得想个办法在超过一定记录数后清除,或转存到其他的表中。
如果谁有好的方法解决上面的问题,请联系wfn_libo@163.com