.Net Mvc过滤器观察者模式记录网站报错信息
基本介绍:#
观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主题是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。观察者模式不仅被广泛应用于软件界面元素之间的交互,在业务对象之间的交互、权限管理等方面也有广泛的应用。
第一步:自定义过滤器错误类(MyExceptionFilterAttribute.cs)#
1 using Sam.OA.Common; 2 using System.Web.Mvc; 3 4 namespace Sam.OA.WEBAPP.Models 5 { 6 public class MyExceptionFilterAttribute: HandleErrorAttribute 7 { 8 public override void OnException(ExceptionContext filterContext) 9 { 10 base.OnException(filterContext); 11 LogHelper.WriteLog(filterContext.Exception.ToString()); 12 } 13 } 14 }
第二步:改造RegisterGlobalFilters.cs#
1 using Sam.OA.WEBAPP.Models; 2 using System.Web.Mvc; 3 4 namespace Sam.OA.WEBAPP 5 { 6 public class FilterConfig 7 { 8 public static void RegisterGlobalFilters(GlobalFilterCollection filters) 9 { 10 //filters.Add(new HandleErrorAttribute()); 11 filters.Add(new MyExceptionFilterAttribute()); //添加自定义错误类 12 } 13 } 14 }
第三步:观察者模式实现操作日志#
日志接口(ILogWrite.cs)
1 namespace Sam.OA.Common 2 { 3 /// <summary> 4 /// 日志文件接口 5 /// </summary> 6 public interface ILogWrite 7 { 8 void WriteLogInfo(string txt); 9 } 10 }
记录文件中(TextFileWriter.cs)
1 namespace Sam.OA.Common 2 { 3 public class TextFileWriter : ILogWrite 4 { 5 /// <summary> 6 /// 将错误信息记录到文件中 7 /// </summary> 8 /// <param name="txt"></param> 9 public void WriteLogInfo(string txt) 10 { 11 //具体实现方法略。。。。 12 } 13 } 14 }
记录SqlServer中(SqlServerWriter.cs)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Sam.OA.Common 8 { 9 public class SqlServerWriter : ILogWrite 10 { 11 /// <summary> 12 /// 记录SqlServer数据库中 13 /// </summary> 14 /// <param name="txt"></param> 15 public void WriteLogInfo(string txt) 16 { 17 //具体实现方式略。。。。 18 } 19 } 20 }
日志文件帮助类(LogHelper.cs)
1 using System; 2 using System.Collections.Generic; 3 using System.Threading; 4 5 namespace Sam.OA.Common 6 { 7 public class LogHelper 8 { 9 public static Queue<string> ExceptionStringQueue = new Queue<string>(); 10 public static List<ILogWrite> LogWriteList = new List<ILogWrite>(); 11 static LogHelper() 12 { 13 LogWriteList.Add(new TextFileWriter()); 14 LogWriteList.Add(new SqlServerWriter()); 15 ThreadPool.QueueUserWorkItem(obj => 16 { 17 while (true) 18 { 19 lock (ExceptionStringQueue) 20 { 21 if (ExceptionStringQueue.Count > 0) 22 { 23 string str = ExceptionStringQueue.Dequeue(); 24 foreach (var logWrite in LogWriteList) 25 { 26 logWrite.WriteLogInfo(str); 27 } 28 } 29 else 30 { 31 Thread.Sleep(30); 32 } 33 } 34 } 35 }); 36 } 37 public static void WriteLog(string exceptionText) 38 { 39 try 40 { 41 lock (ExceptionStringQueue) 42 { 43 ExceptionStringQueue.Enqueue(exceptionText); 44 } 45 } 46 catch (Exception ex) 47 { 48 throw ex; 49 } 50 } 51 } 52 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?