且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

C#中使用EventLog类写Windows事件日志

更新时间:2022-05-14 08:21:35

在程序中经常需要将指定的信息(包括异常信息和正常处理信息)写到日志中。从C#3.0开始可以使用EventLog类(在System.Diagnostics命名空间中)将各种信息写入Windows日志。在 管理工具->事件查看器 中可以查看写入的Windows日志。

  下面是使用EventLog类向应用程序(Application)写入日志的示例,日志类型使用EventLogEntryType枚举类型指定:

EventLog log = new EventLog();
try
{
log.Source = "我的应用程序";
log.WriteEntry("处理信息1", EventLogEntryType.Information);
log.WriteEntry("处理信息2", EventLogEntryType.Information);
throw new System.IO.FileNotFoundException("readme.txt文件未找到");
}
catch (System.IO.FileNotFoundException exception)
{
log.WriteEntry("处理信息2", EventLogEntryType.Error);
}

  运行上面的代码后会将一个错误事件写入日志信息。其中WriteEntry方法的第一个参数指定的信息显示在日志描述中。

  在默认情况下,EventLog类将日志写在Application事件里,通过EventLog的构造方法的参数也可以指定其他的日志,如系统(System)事件,但要注意在向非Application事件写日志信息时,需要先使用CreateEventSource方法将事件源添加到当前事件中。

  下面的例子演示了如何向“系统”事件中添加日志信息:

EventLog log = new EventLog("System");
// 首先应判断日志来源是否存在,一个日志来源只能与一个事件绑定
if(!EventLog.SourceExists("My Application"))
EventLog.CreateEventSource("My Application", "System");
try
{
log.Source = "My Application";
log.WriteEntry("处理信息1", EventLogEntryType.Information);
log.WriteEntry("处理信息2", EventLogEntryType.Information);
throw new System.IO.FileNotFoundException("readme.txt文件未找到");
}
catch (System.IO.FileNotFoundException exception)
{
log.WriteEntry(exception.Message, EventLogEntryType.Error);
}

  执行上面的代码后将向System事件写入的日志。

  我们也可以通过EventLog类的添加自己的事件,代码如下:

EventLog log = new EventLog("MyEvent");
if(!EventLog.SourceExists("New Application"))
EventLog.CreateEventSource("New Application", "MyEvent");
try
{
log.Source = "New Applications";
log.WriteEntry("处理信息1", EventLogEntryType.Information);
log.WriteEntry("处理信息2", EventLogEntryType.Information);
throw new System.IO.FileNotFoundException("readme.txt文件未找到");
}
catch (System.IO.FileNotFoundException exception)
{
log.WriteEntry(exception.Message, EventLogEntryType.Error);
}

  上面的代码添加了一个MyEvent事件,添加后的事件查看器的左侧增加MyEvent事件,该事件与“应用程序”、“系统”等在同一层。
  还可以使用EventLog类来枚举指定事件中的日志,如下面的代码所示:

if (EventLog.Exists("MyEvent"))
{
EventLog log = new EventLog("MyEvent");
foreach (EventLogEntry entry in log.Entries)
{
textBox1.Text += entry.Message + ":";
}
}

  上面的代码枚举了刚才建立的MyEvent事件中的所有日志,并输出了每一个日志的信息(即WriteEntry方法的第一个参数指定的信息)。除此之外还可以使用Delete方法删除指定的事件,使用DeleteEventSource方法删除日志源。
  在写入Windows事件日志时要注意,如果事件日志文件已满,可以在事件属性对话框(在事件右键菜单中选择“属性”菜单项会弹出该对话框)中增加日志文件的大小,或清空当前事件中的日志。