在实际开发Asp.Net项目时,程序可能会出现一些异常,那么我们应该怎么去获得尽量多的系统异常,以便后期维护过程能够尽可能重现异常,及时分析、发现和修复Bug。为了处理这个问题,我写了一个小程序来帮助实现我的需求。
首先,我写了一个日志记录的类,以便能够把捕获的异常以及相关的用户信息以XML方式写入指定目录:
using System;using System.Data;using System.Data.SqlClient;using System.IO;using System.Xml;namespace Logs{ /// <summary> /// Logs 的摘要说明。 /// </summary> public class WebLogs { private string logPath = string.Empty; public WebLogs(string LogPath) { // // TODO: 在此处添加构造函数逻辑 // logPath = LogPath; } public string FloderPath { get { return logPath; } set { logPath = value; } } public void Add(string LogType,string UserName,string Content,string IP,string Agent,string Url,string UrlReferrer) { string filename = LogType+"-"+DateTime.Now.ToShortDateString()+".xml"; string filepath = logPath + filename; LogWrite(filepath,UserName,Content,IP,Agent,Url,UrlReferrer); } private void LogWrite(string filepath,string UserName,string Content,string IP,string Agent,string Url,string UrlReferrer) { XmlDocument xdoc = new XmlDocument(); if(!File.Exists(filepath)) { xdoc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>"+ "<WebLogs></WebLogs>"); } else { xdoc.Load(filepath); }// 创建一个新的日志节点并将它添加到根节点下 XmlElement parentNode = xdoc.CreateElement("WebLog"); xdoc.DocumentElement.PrependChild(parentNode); // 创建所有用于存储信息的节点 XmlElement nameNode = xdoc.CreateElement("UserName"); XmlElement contentNode = xdoc.CreateElement("Content"); XmlElement timeNode = xdoc.CreateElement("Time"); XmlElement ipNode = xdoc.CreateElement("IP"); XmlElement agentNode = xdoc.CreateElement("Agent"); XmlElement urlNode = xdoc.CreateElement("Url"); XmlElement referrerNode = xdoc.CreateElement("Referrer"); // 获取文本信息 XmlText nameText = xdoc.CreateTextNode(UserName); XmlText contentText = xdoc.CreateTextNode(Content); XmlText timeText = xdoc.CreateTextNode(DateTime.Now.ToString()); XmlText ipText = xdoc.CreateTextNode(IP); XmlText agentText = xdoc.CreateTextNode(Agent); XmlText urlText = xdoc.CreateTextNode(Url); XmlText referrerText = xdoc.CreateTextNode(UrlReferrer);// 将上面创建的各个存储信息的节点添加到guest节点下但并不包含最终的值 parentNode.AppendChild(nameNode); parentNode.AppendChild(contentNode); parentNode.AppendChild(timeNode); parentNode.AppendChild(ipNode); parentNode.AppendChild(agentNode); parentNode.AppendChild(urlNode); parentNode.AppendChild(referrerNode); // 将上面获取的文本信息添加到与之相对应的节点中 nameNode.AppendChild(nameText); contentNode.AppendChild(contentText); timeNode.AppendChild(timeText); ipNode.AppendChild(ipText); agentNode.AppendChild(agentText); urlNode.AppendChild(urlText); referrerNode.AppendChild(referrerText); // 保存存储信息的XML文件 xdoc.Save(filepath); xdoc = null; } }}
然后,我在我的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);
Page rendered at Thursday, August 28, 2008 12:25:22 PM (China Standard Time, UTC+08:00)
Disclaimer - 这个Blog是我的个人空间,只代表我个人的看法和言论。 - 拒绝在未经过本人许可的情况下在任何商业性出版物品或商业性网站上引用本站文章。 - 欢迎其他Blogger在自己的Blog中引用我的文章,但请注明Trackback URL。 - 鲁ICP备05009011号