新建一个类继承自 HandleErrorAttribute,然后重写OnException这个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class LogHandleErrorAttribute: HandleErrorAttribute { private readonly ILoggerService _log;
public LogHandleErrorAttribute(ILoggerService log) { this._log = log; } public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); _log.Error("被系统过滤捕获的异常" + filterContext.Exception.ToString()); filterContext.HttpContext.Response.Redirect("/"); } }
|
只要程序出错就会执行这个方法。
注册定义好的异常过虑器
打开App_Start文件夹中FilterConfig.cs修改
1 2 3 4 5
| public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new LogHandleErrorAttribute()); }
|
先写好ILogService接口
1 2 3 4 5 6 7 8 9 10
| public interface ILoggerService { void Info(string message); void Warn(string message); void Debug(string message); void Error(string message); void Error(Exception ex); void Fatal(string message); void Fatal(Exception ex); }
|
自定义记录日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| public class MyLogHelper:ILoggerService { private static Queue<string> _execptionQueue; static MyLogHelper() { _execptionQueue = new Queue<string>(); ThreadPool.QueueUserWorkItem(m => { while (true) { if (_execptionQueue.Count > 0) { var ex = _execptionQueue.Dequeue(); if (ex != null) { WriteLog(ex); } else { Thread.Sleep(2000); } } else { Thread.Sleep(2000); } } }); } public void Info(string message) { throw new NotImplementedException(); } public void Warn(string message) { throw new NotImplementedException(); } public void Debug(string message) { throw new NotImplementedException(); } public void Error(string message) { _execptionQueue.Enqueue(message); } public void Error(Exception ex) { throw new NotImplementedException(); } public void Fatal(string message) { throw new NotImplementedException(); } public void Fatal(Exception ex) { throw new NotImplementedException(); } public static void WriteLog(string exception) { lock (_execptionQueue) { File.AppendAllText($@"C:\log_{DateTime.Now.ToString("yy-MM-dd")}", exception); } } }
|
主要先使用队列将异常信息记录在内存中,通过静态构造函数在里面开启新线程每两秒往文件中记录异常信息
1 2 3 4
| public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new LogHandleErrorAttribute(new MyLogHelper())); }
|
通过log4net记录日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| public class LogHelper:ILoggerService { private readonly ILog _logger;
private static Queue<string> _execptionQueue; public LogHelper() { _logger = LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
_execptionQueue = new Queue<string>();
ThreadPool.QueueUserWorkItem(m => { while (true) { if (_execptionQueue.Count > 0) { var ex = _execptionQueue.Dequeue(); if (ex != null) { _logger.Error(ex); } else { Thread.Sleep(2000); } } else { Thread.Sleep(2000); } } }); }
public void Info(string message) { _logger.Info(message); } public void Warn(string message) { _logger.Warn(message); } public void Debug(string message) { _logger.Debug(message); } public void Error(string message) { _execptionQueue.Enqueue(message); } public void Error(Exception ex) { _logger.Error(ex.Message, ex); } public void Fatal(string message) { _logger.Fatal(message); } public void Fatal(Exception ex) { _logger.Fatal(ex.Message, ex); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new LogHandleErrorAttribute(new LogHelper())); InitLogHandleError(); } public static void InitLogHandleError() { log4net.Config.XmlConfigurator.Configure(); } }
|
web.config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <configuration> <configSections> ...... <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4Net" /> </configSections> ...... <log4net> <root> <level value="ALL" /> <appender-ref ref="SysAppender" /> </root> <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"> <conversionPattern value="{%level}%date{MM/dd HH:mm:ss} - %message%newline%newline"/> </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> </configuration>
|