在实际开发Asp.Net项目时,程序可能会出现一些异常,那么我们应该怎么去获得尽量多的系统异常,以便后期维护过程能够尽可能重现异常,及时分析、发现和修复Bug。为了处理这个问题,我写了一个小程序来帮助实现我的需求。
首先,我写了一个日志记录的类,以便能够把捕获的异常以及相关的用户信息以XML方式写入指定目录:
1
using System;
2
using System.Data;
3
using System.Data.SqlClient;
4
using System.IO;
5
using System.Xml;
6
7
namespace Logs
8
{
9
/// <summary>
10
/// Logs 的摘要说明。
11
/// </summary>
12
public class WebLogs
13
{
14
private string logPath = string.Empty;
15
16
public WebLogs(string LogPath)
17
{
18
//
19
// TODO: 在此处添加构造函数逻辑
20
//
21
logPath = LogPath;
22
}
23
24
public string FloderPath
25
{
26
get
27
{
28
return logPath;
29
}
30
set
31
{
32
logPath = value;
33
}
34
}
35
36
public void Add(string LogType,string UserName,string Content,string IP,string Agent,string Url,string UrlReferrer)
37
{
38
string filename = LogType+"-"+DateTime.Now.ToShortDateString()+".xml";
39
string filepath = logPath + filename;
40
LogWrite(filepath,UserName,Content,IP,Agent,Url,UrlReferrer);
41
}
42
43
private void LogWrite(string filepath,string UserName,string Content,string IP,string Agent,string Url,string UrlReferrer)
44
{
45
XmlDocument xdoc = new XmlDocument();
46
if(!File.Exists(filepath))
47
{
48
xdoc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
49
"<WebLogs></WebLogs>");
50
}
51
else
52
{
53
xdoc.Load(filepath);
54
}
55
56
// 创建一个新的日志节点并将它添加到根节点下
57
XmlElement parentNode = xdoc.CreateElement("WebLog");
58
xdoc.DocumentElement.PrependChild(parentNode);
59
// 创建所有用于存储信息的节点
60
XmlElement nameNode = xdoc.CreateElement("UserName");
61
XmlElement contentNode = xdoc.CreateElement("Content");
62
XmlElement timeNode = xdoc.CreateElement("Time");
63
XmlElement ipNode = xdoc.CreateElement("IP");
64
XmlElement agentNode = xdoc.CreateElement("Agent");
65
XmlElement urlNode = xdoc.CreateElement("Url");
66
XmlElement referrerNode = xdoc.CreateElement("Referrer");
67
// 获取文本信息
68
XmlText nameText = xdoc.CreateTextNode(UserName);
69
XmlText contentText = xdoc.CreateTextNode(Content);
70
XmlText timeText = xdoc.CreateTextNode(DateTime.Now.ToString());
71
XmlText ipText = xdoc.CreateTextNode(IP);
72
XmlText agentText = xdoc.CreateTextNode(Agent);
73
XmlText urlText = xdoc.CreateTextNode(Url);
74
XmlText referrerText = xdoc.CreateTextNode(UrlReferrer);
75
// 将上面创建的各个存储信息的节点添加到guest节点下但并不包含最终的值
76
parentNode.AppendChild(nameNode);
77
parentNode.AppendChild(contentNode);
78
parentNode.AppendChild(timeNode);
79
parentNode.AppendChild(ipNode);
80
parentNode.AppendChild(agentNode);
81
parentNode.AppendChild(urlNode);
82
parentNode.AppendChild(referrerNode);
83
// 将上面获取的文本信息添加到与之相对应的节点中
84
nameNode.AppendChild(nameText);
85
contentNode.AppendChild(contentText);
86
timeNode.AppendChild(timeText);
87
ipNode.AppendChild(ipText);
88
agentNode.AppendChild(agentText);
89
urlNode.AppendChild(urlText);
90
referrerNode.AppendChild(referrerText);
91
92
// 保存存储信息的XML文件
93
xdoc.Save(filepath);
94
xdoc = null;
95
}
96
}
97
}

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

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

然后,我在我的Asp.Net站点的Global.asax.cs的Application_Error事件里加入以下代码:
WebLogs Logs = new WebLogs(Server.MapPath("logs/"));
string referrerUri = (Request.UrlReferrer != null) ?Request.UrlReferrer.AbsoluteUri : string.Empty;
string UserName = (User.Identity.Name != string.Empty) ? User.Identity.Name : "Anonymous";
Logs.Add("Error",UserName,Server.GetLastError().ToString(),Request.UserHostAddress,Request.UserAgent,Request.Url.AbsoluteUri,referrerUri);
string referrerUri = (Request.UrlReferrer != null) ?Request.UrlReferrer.AbsoluteUri : string.Empty;
string UserName = (User.Identity.Name != string.Empty) ? User.Identity.Name : "Anonymous";
Logs.Add("Error",UserName,Server.GetLastError().ToString(),Request.UserHostAddress,Request.UserAgent,Request.Url.AbsoluteUri,referrerUri);