日期:2014-05-16  浏览次数:20558 次

用log4j向数据库写日志

?

Log4j写入数据库详解原文:http://blog.csdn.net/ziruobing/article/details/3919501

?

文章内容:

?

log4j是一个优秀的开源日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据库,甚至能通过socket输出。本节主要讲述如何将日志信息输入到数据库(可以插入任何数据库,在此主要以MSSQL为例进行详解)。
用log4j将日志写入数据库主要用到是log4j包下的JDBCAppender类,它提供了将日志信息异步写入数据的功能,我们可以直接使用这个类将我们的日志信息写入数据库;也可以扩展JDBCAppender类,就是将JDBCAppender类作为基类。下面将通过一个实例来讲解log4j是如何将日志信息写入数据库的。
我们的需求:我们在软件开发的过程中需要将调试信息、操作信息等记录下来,以便后面的审计,这些日志信息包括用户ID、用户姓名、操作类、路径、方法、操作时间、日志信息。
设计思想:我们采用JDBCAppender类直接将日志信息插入数据库,所有只需要在配置文件配置此类就可以;要获得用户信息需要用过滤器来实现;(假如不需要用户的信息,就不需要设计过滤器,其实大部分情况下都是需要这些用户信息,尤其是在web应用开发中)在日志信息中获得用户信息,就的通过过滤器的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


实现步骤:
1、在你的项目中要确保有log4j和commons-logging这两个jar文件;
2、设置要你要插入日志信息的表结构

?

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[WDZLOG]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)  
drop table [dbo].[WDZLOG]  
GO  
  
CREATE TABLE [dbo].[WDZLOG] (  
    [WDZLOGID] [int] IDENTITY (1, 1) NOT NULL ,  
    [LogName] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,//用户ID  
    [UserName] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,//用户姓名  
    [Class] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,//类名  
    [Mothod] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL //,方法名  
    [CreateTime] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,//产生时间  
    [LogLevel] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,//日志级别  
    [MSG] [varchar] (555) COLLATE Chinese_PRC_CI_AS NULL //日志信息  
) ON [PRIMARY]  
GO  
?

3、配置文件(摘自我们的项目)后面将对此配置文件进行详细讲解,它也log4j的核心部分。(请注意:数据库连接相关的属性值后面能有空格

?

?

log4j.properties  
log4j.rootLogger=INFO,stdout  
              
log4j.logger.org.springframework.web.servlet=INFO,db  
  
log4j.logger.org.springframework.beans.factory.xml=INFO  
log4j.logger.com.neam.stum.user=INFO,db  
  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] - - <%m>%n  
  
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/exppower.log  
log4j.appender.logfile.DatePattern=.yyyy-MM-dd  
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout  
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] wang- <%m>%n  
 
########################  
 
# JDBC Appender  
 
##################