标签:redis服务器 AC ges 代码 tar date user ror prot
查看了一些关于mvc异常日志记录的文章,发现使用redis+log4net的最多,这里简单总结了使用这种方式实现日志记录的过程。直接上步骤:
第一步:配置redis服务器
参考redis的配置和在.net中的使用
第二步:添加自己的异常过滤器(Models文件夹添加一个MyExceptionAttribute类)
1 public class MyExceptionAttribute : HandleErrorAttribute 2 { 3 //----所有用户出现异常,向同一个静态队列添加数据 4 //public static Queue<Exception> exQueue = new Queue<Exception>();//不用redis时,用一个普通的队列保存异常 5 6 //----使用redis队列保存异常 7 //获取redis的client实例 8 public static IRedisClientsManager clientManager = new PooledRedisClientManager(new string[] { "127.0.0.1:6379", "10.122.0.1" }); 9 public static IRedisClient redisClient = clientManager.GetClient(); 10 11 //AOP方式 在出现异常时把异常信息记入到redis队列中 12 public override void OnException(ExceptionContext filterContext) 13 { 14 base.OnException(filterContext); 15 Exception ex = filterContext.Exception; 16 //普通队列记录:exQueue.Enqueue(ex); 17 redisClient.EnqueueItemOnList("excpList", ex.ToString());//异常记入到redis队列 18 19 //指定filterContext.Result不会执行后续Action中代码(下边给了两种提示用户出错的方式) 20 //filterContext.Result = new ContentResult() { Content = "<script>alert(‘出错了!‘)</script>" };//弹出框提示 21 filterContext.Result = new RedirectResult("/error.html");//跳转到错误页 22 23 filterContext.ExceptionHandled = true;//告诉服务器异常已处理,可以执行result了!
//不加这句服务器会继续进行异常的处理,没有为异常配置错误页时跳转到错误黄页(使用这种方法一般不需要在config文件中配置错误页,因为不进入内置的异常处理程序) 24 } 25 }
第三步:设置全局过滤器。也可以对指定Controller或Action添加特性标签,在记录异常时最好配置为全局过滤器
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //把自定义异常处理过滤器设为全局 filters.Add(new MyExceptionAttribute()); } }
第四步:配置global文件
1 protected void Application_Start() 2 { 3 log4net.Config.XmlConfigurator.Configure();//获取Log4Net配置信息(配置信息定义在Web.config文件中) 4 AreaRegistration.RegisterAllAreas(); 5 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 6 RouteConfig.RegisterRoutes(RouteTable.Routes); 7 BundleConfig.RegisterBundles(BundleTable.Bundles); 8 //通过线程不停的从队列获取异常信息 9 ThreadPool.QueueUserWorkItem(x => 10 { 11 while (true) 12 { 13 try 14 { 15 if (MyExceptionAttribute.redisClient.GetListCount("excpList") > 0) 16 { 17 // Exception ex= MyExecptionAttribute.ExceptionQueue.Dequeue();//从队列中拿出数据 18 string errorMsg = MyExceptionAttribute.redisClient.DequeueItemFromList("excpList");//从Redis队列中取出异常数据 19 if (!string.IsNullOrEmpty(errorMsg)) 20 { 21 //将异常信息写到Log4Net中. 22 ILog logger = LogManager.GetLogger("ErrorLog"); 23 logger.Error(errorMsg); 24 } 25 else 26 { 27 Thread.Sleep(1000); 28 } 29 } 30 else 31 { 32 Thread.Sleep(1000);//设置记录间隔1秒 33 } 34 } 35 catch (Exception ex) 36 { 37 //记录出现异常也写入redis异常队列中 38 MyExceptionAttribute.redisClient.EnqueueItemOnList("excpList", ex.ToString()); 39 } 40 } 41 });//callback--end 42 }//--线程end
下边是log4net的配置信息(来源:https://blog.csdn.net/zhulongxi/article/details/73550076)
<configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <root> <level value="ALL"/> <appender-ref ref="SysAppender"/> </root> <!-- Print only messages of level DEBUG or above in the packages --> <logger name="WebLogger"> <level value="DEBUG"/> </logger> <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" > <param name="File" value="App_Data/" /> <!--日志文件位置--> <param name="AppendToFile" value="true" /> <!--文件追加--> <param name="RollingStyle" value="Date" /> <!--回滚:按照日期--> <param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" /> <!--文件名--> <param name="StaticLogFileName" value="false" /> <!--文件名为非静态--> <layout type="log4net.Layout.PatternLayout,log4net"> <!--信息格式--> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> <param name="Header" value=" ----------------------header-------------------------- " /> <param name="Footer" value=" ----------------------footer-------------------------- " /> </layout> </appender> <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> </layout> </appender> </log4net> </configuration>
通过以上4个步骤就可以完成redis队列+log4net异常记录的实现,日志文件存储在App_Data目录下。
参考文章:
1、https://blog.csdn.net/wziyx513225244/article/details/6628627
2、https://blog.csdn.net/zhulongxi/article/details/73550076
标签:redis服务器 AC ges 代码 tar date user ror prot
原文地址:https://www.cnblogs.com/wyy1234/p/9050346.html