









在项目中需要记录业务日志(即用户进行了什么操作,操作什么内容,什么时候,操作内容以结构化的方式存储,以方便以后数据挖掘)。
系统已经采用了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
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。