mvc-百步飞剑-06
说明:LogForNet,操作之前建议阅读mvc中简单的异常记录
1.1 在WebApp的Model中 添加异常处理类 继承于HandleErrorAttribute
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace BBFJ.OA.WebApp.Models { public class MyExceptionAttribute:HandleErrorAttribute { public static Queue<Exception> ExceptionQueue = new Queue<Exception>(); /// <summary> /// 捕获异常信息 /// 别忘了在在异常处理过滤器中注册一下 /// </summary> /// <param name="filterContext"></param> public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); //捕获异常信息 Exception ex = filterContext.Exception; //写到日志时,多个线程同时访问,会造成并发,形成死锁===>写入队列 ExceptionQueue.Enqueue(ex); //跳转到错误页 filterContext.HttpContext.Response.Redirect("/Error.html"); } } } MyExceptionAttribute
1.2 在WebApp下App_Start的FilterConfig异常处理过滤器中注册一下
using BBFJ.OA.WebApp.Models; using System.Web; using System.Web.Mvc; namespace BBFJ.OA.WebApp { public class FilterConfig { //在异常处理过滤器中注册一下 public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new MyExceptionAttribute()); } } } RegisterGlobalFilters
1.3 在WebApp中添加错误页面Error.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> 服务器忙,5秒钟后跳转到首页! </body> </html>
1.4 WebApp中引用Log4net(百度云盘)
1.5在WebConfig文件中加入配置信息
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=152368 --> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!--Spring.Net配置信息--> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/> </sectionGroup> <!--Log4Net配置信息--> <!--Log4NetConfigurationSectionHandler处理Log4Net节中的内容--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <!--Spring.Net配置信息--> <spring> <context> <resource uri="file://~/Config/controllers.xml"/> <resource uri="file://~/Config/Service.xml"/> </context> </spring> <!--Log4Net配置信息--> <!--<log4net> --><!-- Define some output appenders --><!-- --><!--appender类型RollingFileAppender(滚动文件类型,可改为数据库的发送邮件的)--><!-- <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> --><!--日志记录文件名称--><!-- <file value="test.txt"/> --><!--当再次出现错误日志时,继续追加,而非替换--><!-- <appendToFile value="true"/> --><!--回滚备份,当test中超过1M时,会新建一个文件,把test中的内容写入新建的文件.如果写了10个,再来一个会删除test1中数据--><!-- <maxSizeRollBackups value="10"/> --><!--test中最多只能存储1M数据--><!-- <maximumFileSize value="1024KB"/> --><!--回滚备份方式,按文件大小--><!-- <rollingStyle value="Size"/> --><!--日志文件名是否是静态的.多数情况下希望其是按照日期命名--><!-- <staticLogFileName value="true"/> --><!--布局-日期+线程编号+错误等级(共5级None>Fatal>ERROR>WARN>DEBUG>INFO>ALL)+名字(自己起的:ILog logger = LogManager.GetLogger("errorMsg");)+异常信息+回车换行--><!-- <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/> </layout> </appender> <root> --><!--设置级别,如果设置为ERROR,则WARN信息不会儿被记录--><!-- <level value="DEBUG"/> <appender-ref ref="RollingLogFileAppender"/> </root> </log4net>--> <log4net> <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --> <!-- Set root logger level to ERROR and its appenders --> <root> <level value="ALL"/> <appender-ref ref="SysAppender"/> </root> <!-- Print only messages of level DEBUG or above in the packages --> <logger name="WebLogger"> <level value="DEBUG"/> </logger> <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" > <!--把日志文件放入 这个 文件中--> <param name="File" value="App_Data/" /> <!--新的日志 追加 到原有日志 --> <param name="AppendToFile" value="true" /> <!--按照日期备份--> <param name="RollingStyle" value="Date" /> <!--日志文件名--> <param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" /> <!--是否为静态文件名 否 以日期命名--> <param name="StaticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> <param name="Header" value=" ----------------------header-------------------------- " /> <param name="Footer" value=" ----------------------footer-------------------------- " /> </layout> </appender> <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> </layout> </appender> </log4net> <connectionStrings> <add name="OAEntities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=OA;user id=sa;password=sa;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" /> <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-BBFJ.OA.WebApp-20170323131914;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-BBFJ.OA.WebApp-20170323131914.mdf" /> </connectionStrings> <appSettings> <add key="webpages:Version" value="2.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="PreserveLoginUrl" value="true" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> <!--添加配置文件-配置程序集名称与命名空间的名称--> <add key="AssemblyPath" value="BBFJ.OA.DAL" /> <add key="NameSpace" value="BBFJ.OA.DAL" /> </appSettings> <system.web> <httpRuntime targetFramework="4.5" /> <compilation debug="true" targetFramework="4.5" /> <authentication mode="Forms"> <forms loginUrl="~/Account/Login" timeout="2880" /> </authentication> <pages> <namespaces> <add namespace="System.Web.Helpers" /> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Optimization" /> <add namespace="System.Web.Routing" /> <add namespace="System.Web.WebPages" /> </namespaces> </pages> <profile defaultProvider="DefaultProfileProvider"> <providers> <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" /> </providers> </profile> <membership defaultProvider="DefaultMembershipProvider"> <providers> <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> </providers> </membership> <roleManager defaultProvider="DefaultRoleProvider"> <providers> <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" /> </providers> </roleManager> <!-- If you are deploying to a cloud environment that has multiple web server instances, you should change session state mode from "InProc" to "Custom". In addition, change the connection string named "DefaultConnection" to connect to an instance of SQL Server (including SQL Azure and SQL Compact) instead of to SQL Server Express. --> <sessionState mode="InProc" customProvider="DefaultSessionProvider"> <providers> <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" /> </providers> </sessionState> </system.web> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <handlers> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </system.webServer> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" /> <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-1.3.0.0" newVersion="1.3.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> </entityFramework> </configuration>
1.6 初始化:在程序最开始加入log4net.Config.XmlConfigurator.Configure();在日志记录的地方 ILog logger=LogManager.GetLogger("errorMsg")
using BBFJ.OA.WebApp.Models; using log4net; using Spring.Web.Mvc; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using System.Web; using System.Web.Http; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; namespace BBFJ.OA.WebApp { // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明, // 请访问 http://go.microsoft.com/?LinkId=9394801 //SpringMvcApplication继承了System.Web.HttpApplication //通过SpringMvcApplication中的ConfigureApplicationContext();方法,读取配置文件创建IHttpApplication容器 public class MvcApplication : SpringMvcApplication //System.Web.HttpApplication { protected void Application_Start() { //在程序启动时读取了配置文件中关于log4Net的配置信息 log4net.Config.XmlConfigurator.Configure(); AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //开启线程,扫描异常 //建立日志文件夹,拿到物理路径 string filePath = Server.MapPath("/Log/"); //线程池中取线程 ThreadPool.QueueUserWorkItem((a) => { while (true) { //检查异常队列中是否有数据 if (MyExceptionAttribute.ExceptionQueue.Count() > 0) { Exception ex= MyExceptionAttribute.ExceptionQueue.Dequeue(); if (ex != null) { //将异常写入日志文件 // string fileName = DateTime.Now.ToString("yyyy-MM-dd"); // File.AppendAllText(filePath+fileName+".txt",ex.ToString(),System.Text.Encoding.UTF8); //引用using log4net; ILog logger = LogManager.GetLogger("errorMsg"); //将异常信息写入日志 //只存错误信息,不存堆栈信息 logger.Error(ex.Message); logger.Error(ex.ToString()); } else { Thread.Sleep(3000); } } else { //很重要,如果队列中没有数据休息一会 Thread.Sleep(3000); } } }, filePath); } } }
1.7 运行结果



浙公网安备 33010602011771号