通过代码配置 Log4net

  最近将项目的异常日志模块改造成log4net。在Asp.net MVC3 中的改造非常简单,我们只要继承HandleErrorAttribute类使用自定义类,

使用特性即可统一处理MVC controller 下的 所有的Action 方法的异常。无须try ... catch.... 详情请见我的这篇随笔

http://www.cnblogs.com/ryanding/archive/2010/11/16/1878168.html。我们只要在上文的CustomHandleErrorAttribute方法内植入Log4Net 即可。

具体的留给读者自己去实践了。本文主要讲解如何通过代码配置Log4Net。将程序的异常信息保存到相关文件以及SQLSERVER数据库。

       这里需要提下,将异常存储在文件中的好处就是如果sqlserver出现异常或者网络出现异常。就无法确保将异常正常保存到数据库,

此时异常信息依然会被本地文件记录在案。对于Log4Net 这个开源库我们就不讨论其XML配置。这里着重讲解用代码如何启用Log4Net。

具体配置代码如下:

复制代码
  
  
1 public static class Log4netHelper 2 { 3 4 // 记录异常日志数据库连接字符串 5   private const string _ConnectionString = @" data source=your server;initial catalog=your db;integrated security=false;persist security info=True;User ID=sa;Password=1111 " ; 6 7 /// <summary> 8 /// 使用SQLSERVER记录异常日志 9 /// </summary> 10 /// <Author> Ryanding </Author> 11 /// <date> 2011-05-01 </date> 12   public static void LoadADONetAppender() 13 { 14 LoadFileAppender(); 15 16 log4net.Repository.Hierarchy.Hierarchy hier = 17 log4net.LogManager.GetLoggerRepository() as log4net.Repository.Hierarchy.Hierarchy; 18 19 if (hier != null ) 20 { 21 log4net.Appender.AdoNetAppender adoAppender = new log4net.Appender.AdoNetAppender(); 22 adoAppender.Name = " AdoNetAppender " ; 23 adoAppender.CommandType = CommandType.Text; 24 adoAppender.BufferSize = 1 ; 25 adoAppender.ConnectionType = " System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 " ; 26 adoAppender.ConnectionString = _ConnectionString; 27 adoAppender.CommandText = @" INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception) " ; 28 adoAppender.AddParameter( new AdoNetAppenderParameter { ParameterName = " @log_date " , DbType = System.Data.DbType.DateTime, Layout = new log4net.Layout.RawTimeStampLayout() }); 29 adoAppender.AddParameter( new AdoNetAppenderParameter { ParameterName = " @thread " , DbType = System.Data.DbType.String, Size = 255 , Layout = new Layout2RawLayoutAdapter( new PatternLayout( " %thread " )) }); 30 adoAppender.AddParameter( new AdoNetAppenderParameter { ParameterName = " @log_level " , DbType = System.Data.DbType.String, Size = 50 , Layout = new Layout2RawLayoutAdapter( new PatternLayout( " %level " )) }); 31 adoAppender.AddParameter( new AdoNetAppenderParameter { ParameterName = " @logger " , DbType = System.Data.DbType.String, Size = 255 , Layout = new Layout2RawLayoutAdapter( new PatternLayout( " %logger " )) }); 32 adoAppender.AddParameter( new AdoNetAppenderParameter { ParameterName = " @message " , DbType = System.Data.DbType.String, Size = 4000 , Layout = new Layout2RawLayoutAdapter( new PatternLayout( " %message " )) }); 33 adoAppender.AddParameter( new AdoNetAppenderParameter { ParameterName = " @exception " , DbType = System.Data.DbType.String, Size = 4000 , Layout = new Layout2RawLayoutAdapter( new ExceptionLayout()) }); 34 adoAppender.ActivateOptions(); 35 BasicConfigurator.Configure(adoAppender); 36 } 37 38 39 } 40 41 /// <summary> 42 /// 使用文本记录异常日志 43 /// </summary> 44 /// <Author> Ryanding </Author> 45 /// <date> 2011-05-01 </date> 46   public static void LoadFileAppender() 47 { 48 string currentPath = AppDomain.CurrentDomain.BaseDirectory; 49 string txtLogPath = string .Empty; 50 string iisBinPath = AppDomain.CurrentDomain.RelativeSearchPath; 51 52 if ( ! string .IsNullOrEmpty(iisBinPath)) 53 txtLogPath = Path.Combine(iisBinPath, " ErrorLog.txt " ); 54 else 55 txtLogPath = Path.Combine(currentPath, " ErrorLog.txt " ); 56 57 log4net.Repository.Hierarchy.Hierarchy hier = 58 log4net.LogManager.GetLoggerRepository() as log4net.Repository.Hierarchy.Hierarchy; 59 60 FileAppender fileAppender = new FileAppender(); 61 fileAppender.Name = " LogFileAppender " ; 62 fileAppender.File = txtLogPath; 63 fileAppender.AppendToFile = true ; 64 65 PatternLayout patternLayout = new PatternLayout(); 66 patternLayout.ConversionPattern = " 记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline " ; 67 patternLayout.ActivateOptions(); 68 fileAppender.Layout = patternLayout; 69 70 // 选择UTF8编码,确保中文不乱码。 71   fileAppender.Encoding = Encoding.UTF8; 72 73 fileAppender.ActivateOptions(); 74 BasicConfigurator.Configure(fileAppender); 75 76 } 77 78 /// <summary> 79 /// 异常处理 80 /// </summary> 81 /// <param name="methedType"> 出现异常方法的类型。例如:MethodBase.GetCurrentMethod().DeclaringType </param> 82 /// <param name="errorMsg"> 错误信息。例如:SaveBuildingPhoto方法出错。Author:开发者名称 </param> 83 /// <param name="ex"></param> 84   public static void InvokeErrorLog(Type methedType, string errorMsg, Exception ex) 85 { 86 LoadADONetAppender(); 87 ILog log = log4net.LogManager.GetLogger(methedType); 88 log.Info(errorMsg, ex); 89 } 90 }
复制代码

在您的数据库执行以下脚本:

复制代码
  
  
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID (N ' [dbo].[Log] ' ) AND type in (N ' U ' )) BEGIN CREATE TABLE [ dbo ] . [ Log ] ( [ Id ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL , [ Date ] [ datetime ] NOT NULL , [ Thread ] [ varchar ] ( 255 ) NULL , [ Level ] [ varchar ] ( 50 ) NULL , [ Logger ] [ varchar ] ( 255 ) NULL , [ Message ] [ varchar ] ( 4000 ) NULL , [ Exception ] [ varchar ] ( 4000 ) NULL , PRIMARY KEY CLUSTERED ( [ Id ] ASC ) WITH (PAD_INDEX = OFF , IGNORE_DUP_KEY = OFF ) ON [ PRIMARY ] ) ON [ PRIMARY ] END Go
复制代码

调用如下:

复制代码
  
  
1 public bool Login( string userName, string password) 2 { 3 try 4 { 5 // TODO: 6 7 } 8 catch (Exception ex) 9 { 10 Log4netHelper.InvokeErrorLog(MethodBase.GetCurrentMethod().DeclaringType, " 登录方法Login出错-Author:ryanding " , ex); 11 return false ; 12 } 13 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值