最近项目要搭建一个日志平台,没有现成的思路。自己就上网去查,了解log4j搭建日志系统。可以输出在控制台、文件(logfile)、也可以输出到数据库。输出到数据库可以用log4j的配置,也可以继承org.apache.log4j.AppenderSkeleton;实现输出。但是实现类,不能由spring注入baseDao.这是个很烦恼的问题,于是想用一个独立的jdbc解决这个问题,但是这又似乎太变态了。哎……自己快要写完了,但是还是想放弃,因为这是让人很难受的代码,一个项目的代码应该是一个完美的系统,但这跟我想的完美太远了。后来突然想到了java调用spring管理的bean,这个问题就水到渠成的解决了。
实现代码如下:
package com.yt.service;
import java.sql.SQLException;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.Level;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.yt.base.BaseDao;
import com.yt.model.AbstractLog;
import com.yt.model.DBLog;
/**
* @ClassName: DBAppender
* @Description: log4j输出到数据库
* @Author He Rongbing
* @Date Nov 18, 2010 10:28:33 AM
*/
public class DBAppender extends AppenderSkeleton {
private BaseDao baseDao = null;//从spring context中得到,这里用单例
public static HttpServletRequest request = null;//静态的,从外面传过来。
@Override
protected void append(LoggingEvent arg0) {
AbstractLog log = (AbstractLog) arg0.getMessage();
getBaseDao();
if (log != null&&baseDao!=null) {
HashMap<String, Object> hm = new HashMap<String, Object>();
hm.put("RZXX", log.getLogMSG());
hm.put("RZLX", log.getLogType());
hm.put("CLL", log.getOpeClass());
hm.put("CZRY", log.getOpeYH());
hm.put("GNMC", log.getOpeName());
hm.put("YXJG", log.getOpeResult());
hm.put("CZSJ", new Timestamp(arg0.timeStamp));
hm.put("RZJB",arg0.getLevel().toString() );
if (log instanceof DBLog) {
DBLog dbLog = (DBLog) log;
hm.put("CZLX", dbLog.getOpeType());
} else {
hm.put("CZLX", "");
}
try {
baseDao.executeInsert("xt.insertLog", hm);
} catch (SQLException e) {
System.out.println("**************写系统日志表失败!**************");
e.printStackTrace();
}
}
}
public void close() {
closed = true;
}
public boolean requiresLayout() {
return false;
}
/**
* @Title: getBaseDao
* @Description: 得到baseDao,从spring配置中得到,这里需要一个HttpServletRequest
* @Author:He Rongbing
*/
private void getBaseDao() {
if (baseDao==null){
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
baseDao = (BaseDao)ctx.getBean("baseDao");
}
}
}
java调用spring管理的bean,在一些基础类和接口类的编写中会非常有用,因为许多类不在我们的spring管理范围内。这里特意总结,算是对自己思考的肯定,自己总结以后一定用的着,也是跟朋友们交流。