您现在的位置是:网站首页> 编程资料编程资料

ASP.NET MVC自定义异常过滤器使用案例_实用技巧_

2023-05-24 352人已围观

简介 ASP.NET MVC自定义异常过滤器使用案例_实用技巧_

上一篇文章中讲解了自定义异常过滤器,这篇文章会结合工作中的真实案例讲解一下如何使用自定义异常过滤器。

一、需求

本案例要实现的功能需求:在发生异常时记录日志,日志内容包括发生异常的Controller名称、Action名称、使用浏览器类型和版本等。

二、案例

1、创建工具类

首先创建项目中需要使用的工具类。

1.1、创建日志工具类

在案例中使用Log4net来记录日志。首先要添加对Log4net的引用,直接在NuGet里面搜索Log4net,然后安装即可。

日志消息实体类代码如下:

using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MVCCuetomerExcepFilterDemo.Models { ///  /// 日志消息实体类 ///  public class LogMessageEntity { ///  /// 操作时间 ///  public DateTime OperationTime { get; set; } ///  /// Url地址 ///  public string Url { get; set; } ///  /// 类名 ///  public string Class { get; set; } ///  /// IP ///  public string Ip { get; set; } ///  /// 主机 ///  public string Host { get; set; } ///  /// 浏览器 ///  public string Browser { get; set; } ///  /// 操作人 ///  public string UserName { get; set; } ///  /// 内容 ///  public string Content { get; set; } ///  /// 异常信息 ///  public string ExceptionInfo { get; set; } ///  /// 异常来源 ///  public string ExceptionSource { get; set; } ///  /// 异常信息备注 ///  public string ExceptionRemark { get; set; } } }

创建日志级别枚举类型,分别对应Log4net中的日志级别,代码如下:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Web; namespace MVCCuetomerExcepFilterDemo.Models.Enums { ///  /// 日志级别 ///  public enum LogLevel { ///  /// 错误 ///  [Description("错误")] Error, ///  /// 警告 ///  [Description("警告")] Warning, ///  /// 信息 ///  [Description("信息")] Info, ///  /// 调试 ///  [Description("调试")] Debug } }

创建一个对日志格式进行格式化的类,代码如下:

using MVCCuetomerExcepFilterDemo.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; namespace MVCCuetomerExcepFilterDemo.Util { ///  /// 日志格式器 ///  public class LogFormat { ///  /// 生成错误 ///  /// 对象 ///  public string ErrorFormat(LogMessageEntity logMessage) { StringBuilder strInfo = new StringBuilder(); strInfo.Append("1. 错误: >> 操作时间: " + logMessage.OperationTime + " 操作人: " + logMessage.UserName + " \r\n"); strInfo.Append("2. 地址: " + logMessage.Url + " \r\n"); strInfo.Append("3. 类名: " + logMessage.Class + " \r\n"); strInfo.Append("4. Ip : " + logMessage.Ip + " 主机: " + logMessage.Host + " 浏览器: " + logMessage.Browser + " \r\n"); strInfo.Append("5. 内容: " + logMessage.Content + "\r\n"); strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n"); return strInfo.ToString(); } ///  /// 生成警告 ///  /// 对象 ///  public string WarnFormat(LogMessageEntity logMessage) { StringBuilder strInfo = new StringBuilder(); strInfo.Append("1. 警告: >> 操作时间: " + logMessage.OperationTime + " 操作人: " + logMessage.UserName + " \r\n"); strInfo.Append("2. 地址: " + logMessage.Url + " \r\n"); strInfo.Append("3. 类名: " + logMessage.Class + " \r\n"); strInfo.Append("4. Ip : " + logMessage.Ip + " 主机: " + logMessage.Host + " 浏览器: " + logMessage.Browser + " \r\n"); strInfo.Append("5. 内容: " + logMessage.Content + "\r\n"); strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n"); return strInfo.ToString(); } ///  /// 生成信息 ///  /// 对象 ///  public string InfoFormat(LogMessageEntity logMessage) { StringBuilder strInfo = new StringBuilder(); strInfo.Append("1. 信息: >> 操作时间: " + logMessage.OperationTime + " 操作人: " + logMessage.UserName + " \r\n"); strInfo.Append("2. 地址: " + logMessage.Url + " \r\n"); strInfo.Append("3. 类名: " + logMessage.Class + " \r\n"); strInfo.Append("4. Ip : " + logMessage.Ip + " 主机: " + logMessage.Host + " 浏览器: " + logMessage.Browser + " \r\n"); strInfo.Append("5. 内容: " + logMessage.Content + "\r\n"); strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n"); return strInfo.ToString(); } ///  /// 生成调试 ///  /// 对象 ///  public string DebugFormat(LogMessageEntity logMessage) { StringBuilder strInfo = new StringBuilder(); strInfo.Append("1. 调试: >> 操作时间: " + logMessage.OperationTime + " 操作人: " + logMessage.UserName + " \r\n"); strInfo.Append("2. 地址: " + logMessage.Url + " \r\n"); strInfo.Append("3. 类名: " + logMessage.Class + " \r\n"); strInfo.Append("4. Ip : " + logMessage.Ip + " 主机: " + logMessage.Host + " 浏览器: " + logMessage.Browser + " \r\n"); strInfo.Append("5. 内容: " + logMessage.Content + "\r\n"); strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n"); return strInfo.ToString(); } ///  /// 生成异常信息 ///  /// 对象 ///  public string ExceptionFormat(LogMessageEntity logMessage) { StringBuilder strInfo = new StringBuilder(); strInfo.Append("1. 调试: >> 操作时间: " + logMessage.OperationTime + " 操作人: " + logMessage.UserName + " \r\n"); strInfo.Append("2. 地址: " + logMessage.Url + " \r\n"); strInfo.Append("3. 类名: " + logMessage.Class + " \r\n"); strInfo.Append("4. 主机: " + logMessage.Host + " Ip : " + logMessage.Ip + " 浏览器: " + logMessage.Browser + " \r\n"); strInfo.Append("5. 异常: " + logMessage.ExceptionInfo + "\r\n"); //strInfo.Append("6. 来源: " + logMessage.ExceptionSource + "\r\n"); //strInfo.Append("7. 实例: " + logMessage.ExceptionRemark + "\r\n"); strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n"); return strInfo.ToString(); } } }

创建日志类,代码如下:

using log4net; using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MVCCuetomerExcepFilterDemo.Util { ///  /// 日志 ///  public class Log { private ILog logger; public Log(ILog log) { this.logger = log; } public void Debug(object message) { this.logger.Debug(message); } public void Error(object message) { this.logger.Error(message); } public void Info(object message) { this.logger.Info(message); } public void Warn(object message) { this.logger.Warn(message); } } }

创建日志初始化类,代码如下:

using log4net; using MVCCuetomerExcepFilterDemo.Models; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; namespace MVCCuetomerExcepFilterDemo.Util { ///  /// 日志初始化 ///  public class LogFactory { static LogFactory() { FileInfo configFile = new FileInfo(HttpContext.Current.Server.MapPath("/XmlConfig/log4net.config")); log4net.Config.XmlConfigurator.Configure(configFile); } public static Log GetLogger(Type type) { return new Log(LogManager.GetLogger(type)); } public static Log GetLogger(string str) { return new Log(LogManager.GetLogger(str)); } } }

最后添加log4net的配置文件:

-六神源码网