基本介绍:

  观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主题是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。观察者模式不仅被广泛应用于软件界面元素之间的交互,在业务对象之间的交互、权限管理等方面也有广泛的应用。

第一步:自定义过滤器错误类(MyExceptionFilterAttribute.cs)

 using Sam.OA.Common;
using System.Web.Mvc; namespace Sam.OA.WEBAPP.Models
{
public class MyExceptionFilterAttribute: HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
LogHelper.WriteLog(filterContext.Exception.ToString());
}
}
}

第二步:改造RegisterGlobalFilters.cs

 using Sam.OA.WEBAPP.Models;
using System.Web.Mvc; namespace Sam.OA.WEBAPP
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
filters.Add(new MyExceptionFilterAttribute()); //添加自定义错误类
}
}
}

第三步:观察者模式实现操作日志

日志接口(ILogWrite.cs)

 namespace Sam.OA.Common
{
/// <summary>
/// 日志文件接口
/// </summary>
public interface ILogWrite
{
void WriteLogInfo(string txt);
}
}

记录文件中(TextFileWriter.cs)

 namespace Sam.OA.Common
{
public class TextFileWriter : ILogWrite
{
/// <summary>
/// 将错误信息记录到文件中
/// </summary>
/// <param name="txt"></param>
public void WriteLogInfo(string txt)
{
//具体实现方法略。。。。
}
}
}

记录SqlServer中(SqlServerWriter.cs)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Sam.OA.Common
{
public class SqlServerWriter : ILogWrite
{
/// <summary>
/// 记录SqlServer数据库中
/// </summary>
/// <param name="txt"></param>
public void WriteLogInfo(string txt)
{
//具体实现方式略。。。。
}
}
}

日志文件帮助类(LogHelper.cs)

 using System;
using System.Collections.Generic;
using System.Threading; namespace Sam.OA.Common
{
public class LogHelper
{
public static Queue<string> ExceptionStringQueue = new Queue<string>();
public static List<ILogWrite> LogWriteList = new List<ILogWrite>();
static LogHelper()
{
LogWriteList.Add(new TextFileWriter());
LogWriteList.Add(new SqlServerWriter());
ThreadPool.QueueUserWorkItem(obj =>
{
while (true)
{
lock (ExceptionStringQueue)
{
if (ExceptionStringQueue.Count > )
{
string str = ExceptionStringQueue.Dequeue();
foreach (var logWrite in LogWriteList)
{
logWrite.WriteLogInfo(str);
}
}
else
{
Thread.Sleep();
}
}
}
});
}
public static void WriteLog(string exceptionText)
{
try
{
lock (ExceptionStringQueue)
{
ExceptionStringQueue.Enqueue(exceptionText);
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}

.Net Mvc过滤器观察者模式记录网站报错信息的更多相关文章

  1. IIS发布网站 报错500.19 错误解决过程记录

    首先先报上我的环境 WindowsServer 2012 IIS 8.5 网站是FrameWork 4.0 发布网站后浏览,报错信息如下: 解决过程记录如下: 1.看到这个问题首先想到的是权限问题,设 ...

  2. 网站报错Access denied for user 'root'@'localhost' -问题排查续

    网站报错Access denied for user 'root'@'localhost' (using password: YES) 每次的挽救办法就是: /etc/init.d/mysqld st ...

  3. Python使用requests模块访问HTTPS网站报错`certificate verify failed`

    使用requests模块访问HTTPS网站报错: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Nam ...

  4. 【转载】访问IIS中网站出现 403.14 - Forbidden报错信息

    将网站发布后部署到IIS后,配置完应用程序池以及相关设置项后,在浏览器中访问设置好的网站,出现403.14 - Forbidden的错误信息,从错误信息的提示来看,应该是IIS服务器此网站目录的内容被 ...

  5. Drupal网站报错:PDOException: in lock_may_be_available()

    Drupal网站报错: 原因: windows中mysql的服务停止了: 解决办法: 在服务中,启动mysql服务 启动后,刷新页面,问题完美解决

  6. vue2.X版本vue-cli生成项目后运行失败,报错信息为getaddrinfo ENOTFOUND localhost

    问题: 1.使用vue-cli生成项目 2.npm install 3.npm run dev,报错信息如下 解决方法: 经查,发现package.json中dev的脚本变成了"webpac ...

  7. python中如何通过报错信息定位问题(异常传播轨迹)

    class SelfException(Exception): pass def main(): firstMethod() def firstMethod(): secondMethod() def ...

  8. Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案

    本文为霍格沃兹测试学院学员学习笔记. Python 装饰器简介 装饰器(Decorator)是 Python 非常实用的一个语法糖功能.装饰器本质是一种返回值也是函数的函数,可以称之为“函数的函数”. ...

  9. SVN Cornerstone 报错信息 xcodeproj cannot be opened because the project file cannot be parsed.

    svn点击update 之后,打开xcode工程文件,会出现  xxx..xcodeproj  cannot be opened becausethe project file cannot be p ...

随机推荐

  1. java三大集合遍历

    1. 场景描述 今天需要用到map集合遍历,一下子忘记咋写了,以前一般用map.get()直接获取值,很少遍历map,刚好总结下java中常用的几个集合-map,set,list遍历. 2. 解决方案 ...

  2. 将 unsiged char 转换成对应的十六进制字符用以显示出来如 unsiged char a[]={0x00,0x01,0x30,0x38}转化为“00013038”

    int CEnCryptionAndDeCryptionDlg::Byte2Hex(const unsigned char* input,unsigned long inLen, unsigned c ...

  3. 个人永久性免费-Excel催化剂功能第33波-报表形式数据结构转标准数据源

    一般来说,如果有标准的数据源结构,对后续的分析工作将会带来极大的方便.但现实中,许多的原始数据并不预期那样,一个主题的数据已经干净地存放在一个工作表中.今天Excel催化剂再次送上批量化操作,将不规则 ...

  4. Hive调优策略

    Hive调优策略 Fetch抓取 Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算. 例如:select * from employee:在这种情况下,Hive可以简单 ...

  5. Android调用系统分享功能总结

    Android分享-调用系统自带的分享功能 实现分享功能的几个办法 1.调用系统的分享功能 2.通过第三方SDK,如ShareSDK,友盟等 3.自行使用各自平台的SDK,比如QQ,微信,微博各自的S ...

  6. html+css test1

    模拟实验楼提供的一个网页.. [可由 git clone https://github.com/shiyanlou/finaltest 获取相关图片素材] <!DOCTYPE html>& ...

  7. [git] 基础命令笔记

    --内容整理自廖雪峰的GIT教程-- git status 查看当前工作区状态,显示未跟踪的文件以及未上传的修改记录 git init 使当前文件夹变成Git可以管理的仓库 git add xxx 将 ...

  8. HTML 去调table表单里面td之间的间距

    首先为大家展示一下最原始的代码和效果.直接在table中用td划分的表格会默认隐藏边框.  接下来我们用css来增加样式,为table增加边框. table { border: 1px solid # ...

  9. vue教程(五)--路由router介绍

    一.html页面中如何使用 1.引入 vue-router.js 2.安装插件 Vue.use(VueRouter) 3.创建路由对象 var router = new VueRouter({ // ...

  10. Centos7 安装Homestead环境

    问题1, ==> homestead-7: Waiting for machine to boot. This may take a few minutes... homestead-7: SS ...