//这个配置是告诉LOG4J,做数据库存储所用的驱动。
log4j.appender.db.URL=jdbc:oracle:thin:@<ip>:<port>:<sid>
//这个配置数据库连接的URL,不用说也都知道。
log4j.appender.db.user=XXX
log4j.appender.db.password=XXX
//上面两个是数据库连接时的用户名和密码
log4j.appender.db.sql=insert into RESLOG
(LogId,Class,Method,createTime,LogLevel,MSG)
values (SQ_RESLOG_LOGID.Nextval,\'%C\',\'%M\',
to_date(\'%d{yyyy-MM-dd HH:mm:ss}\',\'yyyy-MM-dd
HH24:mi:ss\'),\'%p\',\'%m\')
//这个配置是告诉当LOG4J吧日志存储数据库时用的SQL语句。SQ_RESLOG_LOGID.Nextval是我建的一个SEQUENCE;‘%C’是日志中的CLASS;‘%M’是打印日志是执行到类里的方法;‘%d’是打印的时间,它支持格式化;‘%P’是日志级别,包括INFO、DEBUG、ERROR等;‘%m’是MSG,日志内容。注意这里的参数区分大小写。
log4j.appender.db.layout=org.apache.log4j.PatternLayout
通过上面的配置,现在再启动服务,LOG4J就会自动把原来存储在.LOG文件中的信息,同时存储到数据库了。
当然,LOG4J还支持自定义参数,在日志信息中获得用户信息,就的通过过滤器的request或session对象,从session中拿到用户信息怎样传到log4j呢,log4j为我们提供了MDC(MDC是log4j种非常有用类,它们用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。MDC内部使用了类似map的机制来存储信息,上下文信息也是每个线程独立地储存,所不同的是信息都是以它们的key值存储在”map”中。相对应的方法,
MDC.put(key, value); MDC.remove(key); MDC.get(key);
在配置PatternLayout的时候使用:%x{key}来输出对应的value)。有了MDC,我们可以在过滤器中先获得用户信息,再用MDC.Put(“key”)方法,log在执行sql语句时通过%x{key}来输出对应的value。
编写过滤器:
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; import org.apache.log4j.MDC; import com.neam.domain.User; public class ResFilter implements Filter{ private final static double DEFAULT_USERID= Math.random()*100000.0; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)request; HttpSession session= req.getSession(); if (session==null){ MDC.put("userId",DEFAULT_USERID); } else{ User customer=(User)session.getAttribute("user"); if (customer==null){ MDC.put("userId",DEFAULT_USERID); MDC.put("userName",DEFAULT_USERID); } else { MDC.put("userId",customer.getName()); MDC.put("userName",customer.getName()); } } //logger.info("test for MDC."); chain.doFilter(request, response); } public void init(FilterConfig Config) throws ServletException { // this.filterConfig = Config; // String ccc = Config.getServletContext().getInitParameter("cherset"); // this.targetEncoding = Config.getInitParameter("cherset"); } }