MVC4.0 利用HandleErrorAttribute和log4net实现记录异常日志功能
1.MVC4.0中HandleErrorAttribte已经帮我们处理了异常问题,当我们新建一个非空的MVC项目时候,在FilterConfig中会发现这样的代码
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } }
这时候,我们打开web.config中实现customerrors节点的配置,用户就看不到黄页了,将根据异常码,访问你指定的错误页面。
2.上面是为了解决用户体验问题,但是作为开发者,为了更好的维护站点,我们应该了解更多的异常信息,下面我们自定义一个异常类
public class ExceptionHandlerAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); LogHelper.Error(filterContext.Exception.ToString()); } }
接下来将我们自定义的属性注入到全局筛选器中,当项目发生异常的时候,会将异常发送到我们自定义的ExceptionHandlerAttribute中进行处理
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new ExceptionHandlerAttribute()); } }
由于我们使用了log4net记录错误日志,所以我们还需要对log4net进行配置,首先在Application_Start()中初始化log4net的配置
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AuthConfig.RegisterAuth(); LogHelper.LoadConfig(Server.MapPath("~/Config/log4net.config")); } }
根据自己的需求,配置log4net.config
<?xml version="1.0"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!-- 日志文件部分log输出格式的设定 --> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--最小锁定模型以允许多个进程可以写入同一个文件--> <param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" /> <file value="Logs\Log_" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd'.txt'" /> <staticLogFileName value="false" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%newline%date %newline%message %newline" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="Error" /> <param name="LevelMax" value="Error" /> </filter> </appender> <root> <!--<level value="Error" />--> <appender-ref ref="RollingLogFileAppender" /> </root> </log4net> </configuration>
下面是LogHelper类中的代码
public class LogHelper { private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public static void LoadConfig(string path) { log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(path)); } /// <summary> /// 错误信息 /// </summary public static void Error(string error) { log.Error(error); } /// <summary> /// 致命信息 /// </summary> public static void Fatal(string fatal) { log.Fatal(fatal); } /// <summary> /// 一般信息 /// </summary> public static void Info(string info) { log.Info(info); } /// <summary> /// 警告信息 /// </summary> public static void Warn(string warn) { log.Warn(warn); } }