接在来同样是配置文件
<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections> <log4net> <!-- ConversionPattern 解释 %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息 %n(new line):換行 %d(datetime):输出当前语句运行的时刻 %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数 %t(thread id):当前语句所在的线程ID %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等 %c(class):当前日志对象的名称 %L:输出语句所在的行号 %F:输出语句所在的文件名 %-数字:表示该项的最小长度,如果不够,则用空格填充 --> <!--定义输出到控制台命令行中--> <!--<logger name="myLogger"> <level value="ALL"/> <appender-ref ref="ConsoleAppender" /> </logger>--> <!--定义输出到控制台命令行中--> <!--<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="Log4NetTest.MyLayout"> <param name="ConversionPattern" value="日志时间:%d %n日志级别:%-5p %n用 户 ID:%Property{UserID} %n用户姓名:%Property{UserName} %n日志信息:%Property{Message} %n异常信息:%exception %n%n" /> </layout> </appender>--> <!--定义输出到windows事件中--> <!--<appender name="WindowsAppender" type="log4net.Appender.EventLogAppender"> <layout type="Log4NetTest.MyLayout"> <param name="ConversionPattern" value="日志时间:%d %n日志级别:%-5p %n用 户 ID:%Property{UserID} %n用户姓名:%Property{UserName} %n日志信息:%Property{Message} %n异常信息:%exception %n%n" /> </layout> </appender>--> <!--定义输出到文件中--><!-- <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <file value="E:/log4netfile.txt"/> --><!--是否在文件中追加日志信息--><!-- <appendToFile value="true"></appendToFile> --><!--文件输出以日期方式滚动--><!-- <rollingStyle value="Date"></rollingStyle> --><!--日志文件名以输出日期命名,可更改其他日期方式--><!-- --><!--<datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"></datePattern>--><!-- --><!--表明输出的日志信息是否一直在同一文件中--><!-- <staticLogFileName value="false"></staticLogFileName> --><!--备份文件的最大文件数目--><!-- <param name="MaxSizeRollBackups" value="100"></param> <layout type="Log4NetTest.MyLayout"> <param name="ConversionPattern" value="日志时间:%d %n日志级别:%-5p %n用 户 ID:%Property{UserID} %n用户姓名:%Property{UserName} %n日志信息:%Property{Message} %n异常信息:%exception %n%n" /> </layout> </appender>--> <!--定义输出到数据库--> <appender name="DataBaseAppender" type="log4net.Appender.ADONetAppender,log4net"> <!--日志缓存写入条数--> <bufferSize value="0" /> <!--日志数据库连接串--> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <connectionString value="data source=.;initial catalog=test;integrated security=false;persist security info=True;User ID=sa;Password=123456;"/> <!--日志数据库脚本--> <commandText value="INSERT INTO LogInfo ([LogDate],[LogLevel],[UserId],[UserName],[Exception]) VALUES (@LogDate, @LogLevel,@UserId,@UserName,@Exception)" /> <!--日志时间LogDate--> <parameter> <parameterName value="@LogDate" /> <dbType value="String" /> <size value="30" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss}" /> </layout> </parameter> <!--日志类型LogLevel--> <parameter> <parameterName value="@LogLevel" /> <dbType value="String" /> <size value="10" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <!--自定义UserId--> <parameter> <parameterName value="@UserId" /> <dbType value="String" /> <size value="20" /> <layout type="WindowsFormsApplication1.MyLayout"> <conversionPattern value="%Property{UserID}" /> </layout> </parameter> <!--自定义UserName--> <parameter> <parameterName value="@UserName" /> <dbType value="String" /> <size value="50" /> <!--自定义的参数是来着与自己写的类的命名空间--> <layout type="WindowsFormsApplication1.MyLayout"> <conversionPattern value="%Property{UserName}" /> </layout> </parameter> <!--异常信息Exception--> <parameter> <parameterName value="@Exception" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.ExceptionLayout" /> </parameter> </appender> <logger name="logerror"> <level value="INFO"/> <appender-ref ref="DataBaseAppender"/> <!--<appender-ref ref="RollingLogFileAppender"/>--> </logger> </log4net>
接下来要定义一个model,要与配置文件定义的参数一致
namespace WindowsFormsApplication1 { [Serializable] public class model { /// <summary> /// 用户ID /// </summary> public string UserID { get; set; } /// <summary> /// 用户姓名 /// </summary> public string UserName { get; set; } } }
然后定义一个MyLayout.csnamespace WindowsFormsApplication1 { public class MyLayout:PatternLayout { public MyLayout() { //这里的Property是对于配置文件中自定义参数的, //用来配置文件的参数和后台定义的参数连接到一起 this.AddConverter("Property", typeof(MyPatternConverter)); } } }
然后在定义一个MyPatternConverter.cs类
namespace WindowsFormsApplication1
最后附上我写的代码 http://pan.baidu.com/s/1dFMIyOD{ public class MyPatternConverter:PatternLayoutConverter { //这一步重写Convert方法,具体的作用,我也不太清除, //不会就是不会,不希望让你们理解错误 protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent) { if (Option != null) { WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent)); } else { WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties()); } } 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; } } } //然后就是实现方法作用的logHelper.cs类 //用来实现操作 [assembly:log4net.Config.XmlConfigurator(Watch=true)] namespace WindowsFormsApplication1 { public class logHelper { //根据log4net配置 声明不同的只读对象属性 /// <summary> /// static 静态属性 /// readonly 只读属性 /// log4net.LogManager.GetLogger("loginfo") 使用的时候要和xml文件中的 <logger>匹配 读取的是<logger> 的 name 属性 /// </summary> //根据logger name 声明一个封装类ILog对象 INFO 一般信息 static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror"); //一般性错误信息 //static readonly log4net.ILog logmonitor = log4net.LogManager.GetLogger("logmonitor"); //监视信息 // static readonly log4net.ILog mylog = log4net.LogManager.GetLogger("MyLogger"); /// <summary> /// 获取一般错误性信息 /// </summary> /// <param name="ErrorMsg"></param> /// <param name="ex"></param> public static void Error(model ErrorMsg, Exception ex = null) { //根据参数不同,调用error的 不同重载方法 if (ex != null) { logerror.Info(ErrorMsg, ex); } else { logerror.Info(ErrorMsg); } } } } //最后是调用Helper类,完成操作 try { model mo = new model(); mo.UserID = "12346"; mo.UserName = "12345"; logHelper.Error(mo); } catch (Exception EX) { EX.ToString(); }