.NET框架提供了多种日记志工具,比如可以在错误时发送E-mail,添加到数据库记录或者读写文件中。一个较好的方式就是使用Windows事件,Windows事件程序是Windows内置的用于记录系统或者是应用程序日志的一个工具。
1.点击“开始|设置|控制面板|管理工具”菜单,选择事件查看器,可以启动Windows事件查看器窗口。
2.写入事件日志
System.Diagnostics命名空间下提供了可以读写事件日志的类,开发人员可以使用这个命名空间中的类将ASP.NET异常信息写入事件日志中,例如除法运算出现任何异常时将异常信息写入事件日志。
(1)新建一个Default.aspx页面添加两个TextBox控件和一个Button控件和一个Lable控件。
(2)单击按钮时,将从两个文本框中获取数据,并执行除法运算。如果运算中有任何异常,则在Lable控件中显示错误信息,并将异常消息写入事件日志,代码如下:
protected void Button1_Click(object sender , EventArgs e)
{
try
{
//除法运算
decimal a,b,result;
a = decimal.Parse(TextBox1.Text);
b = decimal.Parse(TextBox2.Text);
result = a / b;
}
catch (Exception ex)
{
//显示异常信息
lblResult.Text ="错误消息:"+ex.Message+"<br/>";
lblResult.Text += "错误源:"+ex.Source+"<br/>";
lblResult.Text +="堆栈追踪:"+ex.StackTrace+"<br/>";
//将除法运算错误信息写入事件日志
EventLog elog = new EventLog();
elog.Source = "除法运算错误";
elog.WriteEntry(ex.Message, EventLogEntryType.Error);
}
}
3.自定义日志
自定义日志是指属于自己的分类的日志,比如创建一个属于程序特有的错误分类。
EventLog 提供了几个重载的构造函数,如果为构造函数指定一个分类名称,事件日志将写入到指定分类名称下面。
例:
protected void Button1_Click(object sender , EventArgs e)
{
try
{
//除法运算
decimal a,b,result;
a = decimal.Parse(TextBox1.Text);
b = decimal.Parse(TextBox2.Text);
result = a / b;
}
catch (Exception ex)
{
//显示异常信息
lblResult.Text ="错误消息:"+ex.Message+"<br/>";
lblResult.Text += "错误源:"+ex.Source+"<br/>";
lblResult.Text +="堆栈追踪:"+ex.StackTrace+"<br/>";
//将除法运算错误信息写入事件日志
//调用EventLog的静态方法SourceExists判断指定的事件源是否注册
if(!EventLog.SourceExists("除法运算错误2"))
{
//如果没有注册,调用CreateEventSource方法注册事件,并创建一个新的事件日志
EventLog.CreateEventSource("除法运算2","MyApplicationError");
}
//EventLog可以指定事件日志名称,如果不指定,则为Application事件日志
//该构造函数将打开指定名称的事件日志,如果不存在,则创建一个新的事件日志
EventLog elog = new EventLog("MyApplicationError");
//指定日志源
elog.Source = "除法运算错误2";
//调用WriteEntry方法向日志中写入一个日志项
elog.WriteEntry(ex.Message, EventLogEntryType.Error);
}
}
4.编程查看事件日志
(1)新建Web窗体命名为ShowEventLog.aspx,使用一个GridView控件来显示事件日志信息。
(2)新建一个名为myEventLog.cs的类文件,代码如下:
//需要添加如下两个命名空间
using System.Collections.Generic;
using System.Diagnostics;
//MyEventLog 代表事件日志中的日志项
public class MyEventLog
{
public MyEventLog(string entrytype, string message, DataTime generatetime, string logsource)
{
//日志类型
EntryType = entrytype;
//日志信息
Message = message;
//产生时间
GeneratedTime = generatetime;
//事件来源
LogSource = logsource;
}
public string EntryType {get; set; }
public string Message {get; set; }
public string GeneratedTime {get; set; }
public string LogSource {get; set; }
}
//事件日志列表类, 用于获取事件日志中指定日志名称的事件
public class LogList : List <MyEventLog>
{
public LogList(string logName)
{
//如果日志不存在,引发异常
if(!EventLog.Exists(logName))
{
throw new Exception ("指定的日志名称"+logName+"不存在!")
}
else
{
//打开指定日志名称的日志
EventLog log = new EventLog (logName);
//遍历日志项
foreach (EventLogEntry entry in log.Entries)
{
//构造一个myEventLog 类并添加到日志列表中
MyEventLog mel = new MyEventLog (entry.EntryType.ToString(),entry.Message,entry.TimeGenerated,entry.Source);
this.Add(mel);
}
}
}
}
(3)在ShowEventLog.aspx页面的Page_Load事件处理器中添加如下代码:
protected void Page_Load(object sender, EventArgs e)
{
//获取日志名称为MyApplicationError的日志
LogList loglist = new LogList ("MyApplicationError");
//绑定GridView
GridView1.DataSource = loglist;
GridView1.DataBind();
}