.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 }
复制代码
posted @   陈彦斌  阅读(279)  评论(0编辑  收藏  举报
编辑推荐:
· .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 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示
主题色彩