惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Jina AI
Jina AI
博客园 - Franky
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
阮一峰的网络日志
阮一峰的网络日志
量子位
雷峰网
雷峰网
宝玉的分享
宝玉的分享
V
Visual Studio Blog
博客园_首页
小众软件
小众软件
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
S
SegmentFault 最新的问题
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学

博客园 - Arlen

fusionChart使用手记 asp.net2.0运行时页面编译的跟踪分析 马化腾简历 DataTable.Merge 时出现DataType不致 int32 int64 sql 计算子字符串在父字符串中出现次数的一个非常简单的办法 silver light网站收集 20个免费的SEO网站分析工具 flex asp.net 软件开发人员能力模型 asp.net中webservice请求发送原理和过程的初步分析[原] mysql null问题续 linux下的一些常用操作(与mysql相关) mysql delete update sql B2B B2C C2C vs.net生成后事件 - Arlen - 博客园 互联网创业五大核心问题:既可致胜也可致命 chrome启动崩溃的解决方案 mysql 创建函数时出现 Error Code : 1418 错误解决办法 SQL Server 2005 Data Mining简介[转]
log4net配置写入文本和写入数据库(sqlserver-sqlclient,mysql...
Arlen · 2008-11-22 · via 博客园 - Arlen

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

系统已经采用了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