思路话语

。Arlen:思想有多远你就能走多远...

log4net配置写入文本和写入数据库(sqlserver-sqlclient,mysql-odbc) 传入自定义业务对象

在项目中需要记录业务日志(即用户进行了什么操作,操作什么内容,什么时候,操作内容以结构化的方式存储,以方便以后数据挖掘)。

系统已经采用了log4net来记录文本日志(一般用来记录应用程序错误和我们自己认为需要的提示信息,如“正在解析第i条xml数据...”,当前执行的sql,之类的供开发自己看的信息)。我想既然用了它来记录文本,那就再用它来记录业务日志到数据库吧,反正在log4net中加个Appender就可以。

由于业务需要记录的并不是简单的系统时间%date,级别%level,信息%message等字段,而是自定义的业务字段。发现记日志的info,error,debug等方法可以传入object参数:log.info(object message)。于是到网上查找它是不是象我预想的这样,传一个自定义的业务日志对象给info方法,它自动帮我得到该业务对象的字段的值。

找了半天,答案是:没有。

仔细想了下,难道别人都不这样用吗?我为什么要传入自定义业务对象?要记录的业务操作都是info级别的,根据级别优先级别(由高到低为OFF,FATAL, ERROR,WARN,INFO,DEBUG,ALL),开发时,级别要不定义为debug,要不为all,发布后设置为info。如果同时开启文本和AdoNetAppender,那么除了一些业务操作会进入该日志表,其它只给我自己看的info级别的信息,如前所说的当前执行的sql等信息也会试图存入该表,当然这些是直接传入一句提示信息,所以存入数据库中时,所有字段可能都会是空的。

这样的局面也太尴尬了吧。

这样来讲,似乎log4net并不适合记录这种业务日志。除非有两个非不干涉的log4net。各记录各的日志。

虽然看起来已经没有什么必要,但还是自己做出了解决方案。

下面把配置方式及传入自定义业务对象的解决方案附上。

一、log4net针对sqlserver,mysql及文本的配置方式:

(注:如果配置写入数据库,需要将System.Data.dll拷到bin目录下。)

文本和sqlserver-sqlclient连接库:

Code

 

mysql-odbc方式连接库:

 

Code

 

调用代码:

Code

 

二、log.info(object messageObject)传入自定义对象

比如说插入数据库时需要将该业务操作的原因也记录,假设数据库中该字段名称为Reason。

1.自定义一个业务对象,LogContent

 

Code

 

2.自定义一个Layout(在该类的构造方法中将自定义的Converter加进去,以处理property{}中的自定义字段)和一个PatternConverter:

Code

 

3.配置文件中相应节点:

 

Code

 

4.调用代码:

 

Code

posted on 2008-11-22 13:18  Arlen  阅读(3141)  评论(0编辑  收藏  举报

导航