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

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42
GbyAI
GbyAI
M
MIT News - Artificial intelligence
美团技术团队
罗磊的独立博客
雷峰网
雷峰网
量子位
博客园 - 【当耐特】
Last Week in AI
Last Week in AI
D
Docker
小众软件
小众软件
S
SegmentFault 最新的问题
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
宝玉的分享
宝玉的分享
T
Tailwind CSS Blog
WordPress大学
WordPress大学
V
V2EX
博客园_首页
腾讯CDC
The Cloudflare Blog
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园 - 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