http://www.cnblogs.com/Arlen/archive/2008/11/22/1338908.html
本貼在原來文章的基礎上有些修改,經過本人的實際運作調試運作,本貼中的代碼都可以直接複制使用。
在項目中需要記錄業務日志(即使用者進行了什麼操作,操作什麼内容,什麼時候,操作内容以結構化的方式存儲,以友善以後資料挖掘)。
系統采用了log4net來将業務日志記錄到資料庫中,反正在log4net中加個Appender就可以。由于業務需要記錄的并不是簡單的系統時間%date,級别%level,資訊%message等字段,而是自定義的業務字段。發現記錄日志的info,error,debug等方法可以傳入object參數:log.info(object message)。于是到網上查找它是不是象我們預想的這樣,傳一個自定義的業務日志對象給info方法,它自動幫我得到該業務對象的字段的值。找了半天,答案是:不行。
仔細想了下,難道别人都不這樣用嗎?别人是怎麼傳入自定義業務對象?
雖然看起來已經沒有什麼必要,但還是自己做出了解決方案。
下面把配置方式及傳入自定義業務對象的解決方案附上。
一、log4net針對sqlserver的配置方式:
(注:如果配置寫入資料庫,需要将System.Data.dll拷到bin目錄下。)
再寫入資料庫之前,首先看一下,将要寫入的資料庫表的結構。
![](/image/log4net配置写入SQL%20Server数据库%28sqlserver-sqlclient%29%20并传入自定义业务对象%20-%20niuyongjie的专栏%20-%20CSDN博客.files/0_1280501050q2R6.jpg)
表名是test_log
再看看我們自定義的消息類。
view plain copy to clipboard print ?
- public class LogContent
- {
- public string Reason{get;set;}
- public string Name { get; set; }
- }
萬事具備,隻欠東風了,下面就是配置檔案了。
到了這裡,程式還不能運作,對了,還少一個東西,那就是自定義的MyLayout呀,下面給出代碼。
代碼的調用
運作結果。
大功告成啦。
view plain copy to clipboard print ?
- class Program
- {
- static void Main(string[] args)
- {
- log4net.Config.XmlConfigurator.Configure();
- log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
- log.Info(new LogContent{Reason = "這是一個測試",Name = "張三"});
- Console.ReadKey();
- }
- }
view plain copy to clipboard print ?
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- using log4net.Layout;
- using log4net.Layout.Pattern;
- namespace TestLogNiu
- {
- public class MyLayout : PatternLayout
- {
- public MyLayout()
- {
- this.AddConverter("property", typeof(MyMessagePatternConverter));
- }
- }
- public class MyMessagePatternConverter : PatternLayoutConverter
- {
- protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
- {
- if (Option != null)
- {
- // Write the value for the specified key
- WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
- }
- else
- {
- // Write all the key value pairs
- WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
- }
- }
- /// <summary>
- /// 通過反射擷取傳入的日志對象的某個屬性的值
- /// </summary>
- /// <param name="property"></param>
- /// <returns></returns>
- private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
- {
- object propertyValue = string.Empty;
- PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
- if (propertyInfo != null)
- propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
- return propertyValue;
- }
- }
- }
view plain copy to clipboard print ?
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <configSections>
- <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
- </configSections>
- <log4net>
- <root>
- <level value="All" />
- <appender-ref ref="AdoNetAppender"/>
- </root>
- <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
- <bufferSize value="1" />
- <connectionType value="System.Data.SqlClient.SqlConnection,System.Data, Version=1.0.3300.0, Culture=neutral,PublicKeyToken=b77a5c561934e089" />
- <connectionString value="database=xxx;server=xxx;User ID=sa;Password=xxx" />
- <commandText value="INSERT INTO test_log(記錄時間,消息等級,消息内容,使用者名稱) VALUES (@LogTime,@level,@Reason,@User)" />
- <parameter>
- <parameterName value="@LogTime" />
- <dbType value="DateTime" />
- <layout type="log4net.Layout.RawTimeStampLayout" />
- </parameter>
- <parameter>
- <parameterName value="@level" />
- <dbType value="String" />
- <size value="50" />
- <layout type="log4net.Layout.PatternLayout" value="%level" />
- </parameter>
- <parameter>
- <parameterName value="@Reason" />
- <dbType value="String" />
- <size value="100" />
- <layout type="TestLogNiu.MyLayout, TestLogNiu" >
- <param name="ConversionPattern" value="%property{Reason}"/>
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@User" />
- <dbType value="String" />
- <size value="20" />
- <layout type="TestLogNiu.MyLayout, TestLogNiu" >
- <param name="ConversionPattern" value="%property{Name}"/>
- </layout>
- </parameter>
- </appender>
- </log4net>
- </configuration>