log4net是一个开源的日志记录类库,经过配置后可以自动抓取程序中的错误、异常信息,并写入磁盘,也可以在异常发生时执行其他指定的操作,比如:通知某人右键、写入数据库等。这里写个ASP.NET MVC4应用LogNet的Demo:
1.建立ASP.NET MVC4网站,在web.config中写入log4net的配置文件(就是添加两个节点)
1 <configuration> 2 <configSections> 3 <!-->需要添加第一个的节点<--> 4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 5 </configSections> 6 7 <!-->需要添加第二个的节点<--> 8 <log4net> 9 <!--错误日志配置 :其中name 可以程序员自己定义,但是这个名字一定要和 <logger name="logerror">下面的 10 <appender-ref ref="ErrorAppender"/> 中 ref的值保持一致 11 --> 12 <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> 13 <!--日志文件存储的位置是:Log\LogError\--> 14 <param name="File" value="Log\LogError\" /> 15 <!--表示将内容以追加的形式,保存到日志文件中--> 16 <param name="AppendToFile" value="true" /> 17 <!--每天的日志备份数可以有100个--> 18 <param name="MaxSizeRollBackups" value="100" /> 19 <!--表示每个日志文件的大小只能是10M--> 20 <param name="MaxFileSize" value="10240" /> 21 <!--文件名称是固定格式的--> 22 <param name="StaticLogFileName" value="false" /> 23 <!--文件名称是固定格式为:yyyyMMdd--> 24 <param name="DatePattern" value="yyyyMMdd" /> 25 <!--每天都是以yyyyMMdd来进行命名文件--> 26 <param name="RollingStyle" value="Date" /> 27 <!--设定写入的日志格式--> 28 <layout type="log4net.Layout.PatternLayout"> 29 <param name="ConversionPattern" value="%n异常时间:%d [%t] %n异常级别:%-5p %n异 常 类:%c [%x] %n%m %n " /> 30 </layout> 31 </appender> 32 <!--log4net.LogManager.GetLogger("logerror")用这个来选择这种类型--> 33 <!--additivity="false"表示错误记录只写入一次--> 34 <logger name="logerror" additivity="false"> 35 <!--这个配置文件,如果配置成ALL:表示可以记录 1、信息日志(Info) 2、警告日志(Warn) 3、错误日志(Error)--> 36 <level value="ALL" /> 37 <appender-ref ref="ErrorAppender" /> 38 </logger> 39 <root> 40 <level value="ALL" /> 41 <appender-ref ref="ErrorAppender" /> 42 </root> 43 </log4net> 44 </configuration>
2.建立负责日志记录的LogHelper类
1 public class LogHelper 2 { 3 //通过配置文件的logerror 进行日志写入对象的实例化 4 public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror"); //选择<logger name="logerror">的配置 5 6 //public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo"); //选择<logger name="loginfo">的配置 7 8 static LogHelper() 9 { 10 SetConfig(); 11 } 12 13 /// <summary> 14 /// 初始化web.config中的<log4net>节点中的配置 15 /// </summary> 16 public static void SetConfig() 17 { 18 log4net.Config.XmlConfigurator.Configure(); 19 } 20 21 ///// <summary> 22 ///// 设置自定义的Log4Net配置文件 23 ///// </summary> 24 ///// <param name="configFile"></param> 25 //public static void SetConfig(System.IO.FileInfo configFile) 26 //{ 27 // log4net.Config.XmlConfigurator.Configure(configFile); 28 //} 29 30 /// <summary> 31 /// 负责将信息日志写入到日志文件 32 /// </summary> 33 public static void WriteInfo(string msg) 34 { 35 //检查信息日志是否允许 36 if (logerror.IsInfoEnabled) 37 { 38 //表示写入信息级别的日志 39 logerror.Info(msg); 40 } 41 } 42 43 /// <summary> 44 /// 负责将警告日志写入到日志文件 45 /// </summary> 46 public static void WriteWran(string msg) 47 { 48 if (logerror.IsWarnEnabled) 49 { 50 //表示写入警告级别的日志 51 logerror.Warn(msg); 52 } 53 } 54 55 /// <summary> 56 /// 负责将错误日志写入到日志文件 57 /// </summary> 58 public static void WriteError(string msg) 59 { 60 if (logerror.IsErrorEnabled) 61 { 62 //表示写入异常级别的日志 63 logerror.Error(msg); 64 } 65 } 66 }
3.建立网站与log4net的联系,使log4net能够自动记录网站在运行时出现的异常
MVC4 版本:
1 /// <summary> 2 /// 新建一个继承HandleErrorAttribute的异常类,重写OnException(ExceptionContext filterContext)方法捕捉网站运行时出现的异常。 3 /// </summary> 4 public class MyExceptionAttribute : HandleErrorAttribute 5 { 6 public override void OnException(ExceptionContext filterContext) 7 { 8 Exception exp = filterContext.Exception; 9 ViewResult view = new ViewResult(); 10 view.ViewName = "/Views/Shared/Error.cshtml"; //新建一个视图对象,当网站出现异常时,跳转到自定义的错误页面 11 view.ViewData["Error"] = exp.Message; 12 filterContext.Result = view; 13 filterContext.ExceptionHandled = true; 14 15 while (exp.InnerException != null) 16 { 17 exp = exp.InnerException; 18 } 19 20 LogHelper.WriteError(exp.Message); 21 } 22 }
Asp.Net版本:通过在Global.asax的 Application_Error(Object sender, EventArgs e) 事件中,调用LogHelper类的方法来捕获网站异常记录
1 public class Global : System.Web.HttpApplication 2 { 3 void Application_End(object sender, EventArgs e) 4 { 5 // 在应用程序关闭时运行的代码 6 7 } 8 9 void Session_Start(object sender, EventArgs e) 10 { 11 // 在新会话启动时运行的代码 12 13 } 14 15 void Session_End(object sender, EventArgs e) 16 { 17 // 在会话结束时运行的代码。 18 // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 19 // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 20 // 或 SQLServer,则不会引发该事件。 21 22 } 23 24 /// <summary> 25 /// 程序启动时配置log4net 26 /// </summary> 27 /// <param name="sender"></param> 28 /// <param name="e"></param> 29 protected void Application_Start(Object sender, EventArgs e) 30 { 31 //若不想把log4net配置文件写在web.config中,也可以另外手动指定。 32 //XmlConfigurator.Configure(new FileInfo(HttpContext.Current.Server.MapPath("~/App_Data/log4net.config"))); 33 } 34 35 /// <summary> 36 /// 程序出错时通过log4net写日志 37 /// </summary> 38 /// <param name="sender"></param> 39 /// <param name="e"></param> 40 protected void Application_Error(Object sender, EventArgs e) 41 { 42 Exception objExp = HttpContext.Current.Server.GetLastError(); 43 LogHelper.WriteLog(" 客户机IP:" + Request.UserHostAddress 44 + " 错误地址:" + Request.Url 45 + " 异常信息:" + Server.GetLastError().Message, objExp); 46 } 47 }
4.关闭log4net日志记录功能
在配置文件web.config中找到节点<level value="ALL" />,将value值设置成比ERROR高的等级就不会记录日志。value值对应的等级如下:
OFF
FATAL
ERROR
WARN
INFO
DEBUG
ALL
由下往上,OFF优先级别最高,设置OFF就不再记录日志