.NET MVC记录错误日志

使用处理异常的过滤器 HandleErrorAttribute 

1.新建一个类继承自 HandleErrorAttribute,然后重写OnException这个方法

将错误信息写入队列中

 1     public class MyExceptionAttribute : HandleErrorAttribute
 2     {
 3         public static Queue<Exception> ExecptionQueue = new Queue<Exception>();
 4         /// <summary>
 5         /// 可以捕获异常数据
 6         /// </summary>
 7         /// <param name="filterContext"></param>
 8         public override void OnException(ExceptionContext filterContext)
 9         {
10             base.OnException(filterContext);
11             Exception ex = filterContext.Exception;
12             //写到队列
13             ExecptionQueue.Enqueue(ex);
14             //跳转到错误页面.
15             filterContext.HttpContext.Response.Redirect("/Error.html");
16         }
17     }

 

只要程序出错就会执行这个方法。

2.注册定义好的异常过虑器

打开App_Start文件夹中FilterConfig.cs修改

 

1     public class FilterConfig
2     {
3         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
4         {
5            // filters.Add(new HandleErrorAttribute());
6             filters.Add(new MyExceptionAttribute());
7         }
8     }

 

验证一下:在1中定义的过虑器的ex行打一个断点,然后在控制器的action中增加一段出错的代码

1  public ActionResult Index()
2         {
3             int a = Convert.ToInt16("aaa");
4             return Content(a.ToString());
5            // return View();
6         }

 

运行可以看到效果:

3.开启一个新的线程不断的读取队列,通过Log4把消息写入日志文件

读取消息应该在程序开始的时候就开始执行,在Global.asax.cs中添加代码

 protected void Application_Start()
        {
            log4net.Config.XmlConfigurator.Configure();//读取了配置文件中关于Log4Net配置信息.
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            //开启一个线程,扫描异常信息队列。
            string filePath = Server.MapPath("/Log/");
            ThreadPool.QueueUserWorkItem((a) => {
                while (true)
                {
                    //判断一下队列中是否有数据
                    if (MyExceptionAttribute.ExecptionQueue.Count() > 0)
                    {
                        Exception ex=MyExceptionAttribute.ExecptionQueue.Dequeue();
                        if (ex != null)
                        {
                            //将异常信息写到日志文件中。
                            ILog logger = LogManager.GetLogger("errorMsg");
                            logger.Error(ex.ToString());
                        }
                        else
                        {
                            //如果队列中没有数据,休息
                            Thread.Sleep(3000);
                        }
                    }
                    else
                    {
                        //如果队列中没有数据,休息
                        Thread.Sleep(3000);
                    }
                }
            
            
            },filePath);

        }

5.配置Log4

 1 <configuration>
 2     <configSections>
 3         <!--Log4Net配置-->
 4         <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
 5     </configSections>
 6     <log4net>
 7         <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
 8         <!-- Set root logger level to ERROR and its appenders -->
 9         <root>
10             <level value="ALL" />
11             <appender-ref ref="SysAppender" />
12         </root>
13         <!-- Print only messages of level DEBUG or above in the packages -->
14         <logger name="WebLogger">
15             <level value="DEBUG" />
16         </logger>
17         <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
18             <!--文件路径-->
19             <param name="File" value="App_Data/" />
20             <!--文件追加-->
21             <param name="AppendToFile" value="true" />
22             <!--备份类型-->
23             <param name="RollingStyle" value="Date" />
24             <!--文件名称-->
25             <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />
26             <!--是否固定名称-->
27             <param name="StaticLogFileName" value="false" />
28             <layout type="log4net.Layout.PatternLayout,log4net">
29                 <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
30                 <param name="Header" value="&#13;&#10;----------------------header--------------------------&#13;&#10;" />
31                 <param name="Footer" value="&#13;&#10;----------------------footer--------------------------&#13;&#10;" />
32             </layout>
33         </appender>
34         <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">
35             <layout type="log4net.Layout.PatternLayout,log4net">
36                 <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
37             </layout>
38         </appender>
39     </log4net>
40     <!--Log4Net配置结束-->
41 </configuration>

 

posted @ 2018-06-01 23:32  名猿  阅读(71)  评论(0)    收藏  举报