一、首先在使用log4net记录日志的时候,我们要引用log4net.dll文件
二、在web.config中添加一下配置代码
<configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4Net" /> </configSections>
接着添加一下配置代码:
<!--站点日志配置部分--> <log4net> <!-- Define some output appenders --> <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --> <!-- Set root logger level to ERROR and its appenders --> <root> <level value="ERROR"/> <appender-ref ref="ErrorAppender"/> </root> <!-- Print only messages of level DEBUG or above in the packages --> <logger name="ErrorLogger"> <level value="ERROR"/> </logger> <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender,log4net"> <!--文件保存的地址--> <param name="File" value="App_Data/" /> <!--是否追加--> <param name="AppendToFile" value="true"/> <!--最大日志文件数量--> <param name="MaxSizeRollBackups" value="50"/> <!--文件最大值--> <param name="MaximumFileSize" value="2MB"/> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <param name="RollingStyle" value="Composite"/> <param name="DatePattern" value=""Logs_Error"yyyyMMdd".txt""/> <!--是否只写到一个文件中--> <param name="StaticLogFileName" value="false"/> <layout type="log4net.Layout.PatternLayout"> <!--输出格式--> <!--%logger:错误的对象--> <param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline%newline"/> <param name="Header" value="
-------------------Error-header-------------------

"/> <param name="Footer" value="
-------------------Error-footer-------------------

"/> </layout> </appender> </log4net>
三、创建一个记录异常的过滤器Log4ExceptionAttribute继承HandleErrorAttribute
public static Queue<Exception> Exceptions = new Queue<Exception>(); /// <summary> /// 重写OnException方法来捕获异常数据 /// </summary> /// <param name="filterContext"></param> public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); //捕获当前异常数据 var ex = filterContext.Exception; //将异常数据入队 Exceptions.Enqueue(ex); //跳转到错误页面 filterContext.HttpContext.Response.Redirect("http://www.baidu.com"); }
四、在global.asax中添加一下代码
log4net.Config.XmlConfigurator.Configure(); //开启一个线程,扫描异常信息队列. var filePath = Server.MapPath("/Log/"); ThreadPool.QueueUserWorkItem((a) => { while (true) { //判断队列中是否有数据 if (Log4ExceptionAttribute.Exceptions.Any()) { //出队一条异常信息 var ex = Log4ExceptionAttribute.Exceptions.Dequeue(); //若异常信息不为空 if (ex == null) continue; //将异常信息写入到日志文件中 var logger = LogManager.GetLogger("ErrorLogger"); logger.Error(ex.ToString()); } else { //若异常信息队列为空,则线程休息三秒 Thread.Sleep(3000); } } }, filePath);
最后找到App_Start下的FilterConfig过滤器把刚创建的异常过滤器添加进去
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); filters.Add(new Log4ExceptionAttribute()); }