ASP.NET MVC 异常记录

本文总阅读量:
  1. 1. 自定义记录日志
  2. 2. 通过log4net记录日志

新建一个类继承自 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 HandleErrorAttribute());
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()));
//filters.Add(new LogHandleErrorAttribute(new MyLogHelper()));
InitLogHandleError();
}

/// <summary>
/// 初始化log4net
/// </summary>
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="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<!--<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />-->
<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>