There is a filter that handles exceptions in MVC Handleerrorattribute
1. Create a new class to inherit from Handleerrorattribute, and then override the Onexception method
Public classMyexceptionattribute:handleerrorattribute {/// <summary> ///can capture exception data/// </summary> /// <param name= "Filtercontext" ></param> Public Override voidonexception (Exceptioncontext filtercontext) {Base. Onexception (Filtercontext); Exception ex=filtercontext.exception; //write the error message into the queue } }
This method is executed whenever a program error occurs.
2. Register a defined exception filter
Open the App_start folder FilterConfig.cs Modify
Public Static void registerglobalfilters (globalfiltercollection filters) { //filters. ADD (New Handleerrorattribute ()); Filters. ADD (new Myexceptionattribute ()); }
Verify that the ex line of the filter defined in 1 hits a breakpoint and then adds an error code to the Controller's action
Public actionresult Index () { int a = convert.toint16 ("aaa"); return Content (a.tostring ()); // return View (); }
Run to see the effect:
3. Save the error message in the queue
Because the error is written directly to the log will appear more than one person to operate the log file, can cause concurrency problems, so the error is stored in the queue, and then log data from the queue to the file will not cause concurrency, modify the filter.
Public classMyexceptionattribute:handleerrorattribute {//Create a queue Public StaticQueue<exception> Execptionqueue =NewQueue<exception>(); /// <summary> ///can capture exception data/// </summary> /// <param name= "Filtercontext" ></param> Public Override voidonexception (Exceptioncontext filtercontext) {Base. Onexception (Filtercontext); Exception ex=filtercontext.exception; //write the error message into the queueExecptionqueue.enqueue (ex); //Jump to error pageFilterContext.HttpContext.Response.Redirect ("/error.html"); } }
4. Open a new thread to read the queue continuously, write the message to the log file
The read message should be executed at the beginning of the program, adding code to the Global.asax.cs
protected voidApplication_Start () {arearegistration.registerallareas (); Webapiconfig.register (globalconfiguration.configuration); Filterconfig.registerglobalfilters (globalfilters.filters); Routeconfig.registerroutes (routetable.routes); Bundleconfig.registerbundles (Bundletable.bundles); stringFilePath = Server.MapPath ("/log/"); ThreadPool.QueueUserWorkItem ((a)= { while(true) { //determine if there is data in the queue if(MyExceptionAttribute.execptionQueue.Count >0) { //out TeamException ex =MyExceptionAttribute.execptionQueue.Dequeue (); if(Ex! =NULL) { //Write exception information to the log file stringFileName = DateTime.Now.ToString ("YYYY-MM-DD"); File.appendalltext (FilePath+ FileName +". txt", ex. ToString (), System.Text.Encoding.UTF8); } Else { //If there is no data in the queue, rest for 5 secondsThread.Sleep ( the); } } Else { //If there is no data in the queue, restThread.Sleep ( the); } } }); }
Completes, executes an error statement, the log folder has a log file of error logs.
Error log information logging in ASP.