此演练将带您经过 Visual Studio 应用程序中事件日志记录的主要功能区。通过此演练,您将学会如何:
- 创建 EventLog 组件。
- 编写代码以创建和删除自定义事件日志。
- 将各种类型的项写入自定义日志中。
- 从自定义日志中读取项。
- 验证日志和事件源是否存在。
- 清除日志项。
- 使用服务器资源管理器验证事件日志操作的结果。
创建用户界面
在此演练中,将创建 Windows 窗体并使用它上面的一系列控件启动一系列事件日志记录操作。
为应用程序创建窗体和控件
- 从“新建项目”对话框,创建 Visual Basic 或 C# Windows 应用程序,并将其命名为 EventLogApp1。
- 向该 Windows 窗体添加八个按钮,并为它们设置下列属性:
控件 Text 属性 Name 属性 Button1 创建自定义日志 CreateLog Button2 删除日志 DeleteLog Button3 写入项 WriteEntry Button4 清除日志 ClearLog Button5 验证日志是否存在 VerifyLog Button6 验证源是否存在 VerifySource Button7 移除事件源 RemoveSource Button8 读入项 ReadEntry - 依次为每个按钮执行下列操作:
- 在设计器中,双击该按钮以创建该按钮的默认事件处理程序。代码编辑器出现,而且出现按钮的 Click 事件的 Sub。
- 返回到“设计”视图,然后双击下一个按钮。
- 继续操作,直到为每个按钮创建了默认事件处理程序 Sub。
- 从工具箱的“组件”选项卡中,将 EventLog 组件拖动到窗体上。
窗体底部的组件栏区域出现 EventLog 组件实例。
创建和删除自定义日志
在此过程中,将使用 SourceExists 方法验证您要使用的源不存在,然后使用不存在的日志的名称调用 CreateEventSource 方法。因为此日志不存在,所以当运行此代码时,系统将创建一个自定义日志。
创建自定义日志
- 在代码编辑器中,定位 CreateLog_Click 过程。
- 键入下列代码。事件的日志和源是成对创建的,在事件日志创建之前,源不能存在。创建事件日志后,EventLog 组件被配置为访问新的事件日志。
' Visual Basic ' Source cannot already exist before creating the log. If EventLog.SourceExists("Source1") Then EventLog.DeleteEventSource("Source1") End If ' Logs and Sources are created as a pair. EventLog.CreateEventSource("Source1", "NewLog1") ' Associate the EventLog component with the new log. EventLog1.Log = "NewLog1" EventLog1.Source = "Source1" // C# // Source cannot already exist before creating the log. if (System.Diagnostics.EventLog.SourceExists("Source1")) { System.Diagnostics.EventLog.DeleteEventSource("Source1"); } // Logs and Sources are created as a pair. System.Diagnostics.EventLog.CreateEventSource("Source1", "NewLog1"); // Associate the EventLog component with the new log. eventLog1.Log = "NewLog1"; eventLog1.Source = "Source1";
安全说明 创建事件日志时,如果资源已经存在,需要决定应进行的操作。另一进程(可能是恶意进程)可能已创建了事件日志,并拥有对该事件日志的访问权。将数据放入事件日志后,其他进程就可使用这些数据了。
删除自定义日志
- 在代码编辑器中,找到 DeleteLog_Click 过程。
- 键入下列代码:
' Visual Basic If EventLog.Exists("NewLog1") Then EventLog.Delete("NewLog1") End If // C# if (System.Diagnostics.EventLog.Exists("NewLog1")) { System.Diagnostics.EventLog.Delete("NewLog1"); }
将项写入日志
在此过程中,将使用创建的 EventLog 组件实例将项写入日志中。为此,首先将该组件配置为使用刚刚创建的源字符串,然后指定要写入的两个项:信息性事件和错误事件。
将项写入日志
- 在代码编辑器中,找到 WriteEntry_Click 过程。
- 键入下列代码。该代码使用重载的 EventLog.WriteEntry 方法来写入事件日志。显示的第二个窗体可用于指定消息的类型。如果在后面的“测试代码”部分中使用服务器资源管理器来查看项,则不同类型的项将通过不同的图标来指示。
' Visual Basic EventLog1.WriteEntry("This is an informational message") EventLog1.WriteEntry("This is an error message", _ Diagnostics.EventLogEntryType.Error) // C# eventLog1.WriteEntry("This is an informational message"); eventLog1.WriteEntry("This is an error message", System.Diagnostics.EventLogEntryType.Error);
清除日志项
在此过程中,将使用 Clear 方法从自定义日志中移除现有项。
清除日志项
- 在代码编辑器中,定位 ClearLog_Click 过程。
- 对 EventLog 组件实例调用 Clear 方法:
' Visual Basic EventLog1.Clear() // C# eventLog1.Clear();
验证日志和源
在此过程中,将创建两个过程:一个验证自定义日志是否存在,另一个验证源字符串是否存在。将使用这些过程测试运行项目时执行的各种操作的结果。
验证自定义日志是否存在
- 在代码编辑器中,找到 VerifyLog_Click 过程。
- 创建计算指定的事件日志是否存在并据此显示真或假的消息框。使用此代码:
' Visual Basic Dim logExists As Boolean = EventLog.Exists("NewLog1") MessageBox.Show("Does the log exist? " & logExists.ToString()) // C# bool logExists = System.Diagnostics.EventLog.Exists("NewLog1"); MessageBox.Show("Does the log exist? " + logExists.ToString());
验证源是否存在
- 在代码编辑器中,找到 VerifySource_Click 过程。
- 创建计算指定的源是否存在并据此显示真或假的消息框。使用此代码:
' Visual Basic Dim sourceExists As Boolean = EventLog.SourceExists("Source1") MessageBox.Show("Does the source exist? " + sourceExists.ToString()) // C# bool sourceExists = System.Diagnostics.EventLog.SourceExists("Source1"); MessageBox.Show("Does the source exist? " + sourceExists.ToString());
移除源
在此过程中,您将编写代码以删除源字符串。为此,您将首先验证要删除的源 (Source1) 是否存在,然后调用 DeleteEventSource 方法移除它。
移除创建的事件源
- 在代码编辑器中,找到 RemoveSource_Click 过程。
- 添加下列代码:
' Visual Basic If EventLog.SourceExists("Source1") Then EventLog.DeleteEventSource("Source1") End If // C# if (System.Diagnostics.EventLog.SourceExists("Source1")) { System.Diagnostics.EventLog.DeleteEventSource("Source1"); }
读取项
在此过程中,将编写代码以循环访问事件日志的项集合并显示日志中的现有消息。
从创建的自定义日志中读取项
- 在代码编辑器中,找到 ReadEntry_Click 过程。
- 添加下列代码:
' Visual Basic Dim entry As EventLogEntry If EventLog1.Entries.Count > 0 Then For Each entry In EventLog1.Entries System.Windows.Forms.MessageBox.Show(entry.Message) Next Else MessageBox.Show("There are no entries in the log.") End If // C# if (eventLog1.Entries.Count > 0) { foreach (System.Diagnostics.EventLogEntry entry in eventLog1.Entries) { MessageBox.Show(entry.Message); } } else { MessageBox.Show("There are no entries in the log."); }
测试代码
本节中将使用服务器资源管理器来验证代码的结果。
启动服务器资源管理器
- 从“视图”菜单中,访问服务器资源管理器。
- 展开当前服务器的节点,然后展开它下面的“事件日志”节点。
注意 服务器资源管理器的“服务器”节点在 Visual Basic 和 Visual C# .NET 的标准版中不可用。有关更多信息,请参见 Visual Basic 标准版功能或 Visual C# 标准版的功能。在这种情况下,可以使用 Windows 事件查看器来查看应用程序的结果。
生成和运行应用程序
- 保存文件,并按 F5 键生成和启动项目。出现带有所创建的八个按钮的窗体。
- 单击“创建自定义日志”按钮。
注意 必须对运行应用程序的服务器具有适当的特权,以便创建 Windows 事件日志。如果此时收到安全性错误,请与系统管理员联系。
- 返回到该产品,此时仍处于运行模式中,在服务器资源管理器中右击“事件日志”节点。
- 单击“刷新”。
- 验证现在 NewLog1 日志出现在“事件日志”节点中。
测试创建、删除和验证自定义日志
- 返回到运行的窗体,单击“验证日志是否存在”按钮。
应出现一条其文本设置为 True 的提示。
- 单击“删除日志”按钮,然后再次单击“验证日志是否存在”按钮。
这一次提示应为 False。
- 再次单击“创建自定义日志”按钮重新创建该日志。
测试将项写入自定义日志以及从自定义日志中读取项
- 在窗体中,单击“写入项”按钮。
- 访问服务器资源管理器,并展开 NewLog1 日志。
注意 服务器资源管理器的“服务器”节点在 Visual Basic 和 Visual C# .NET 的标准版中不可用。有关更多信息,请参见 Visual Basic 标准版功能或 Visual C# 标准版的功能。
- 展开它下面的“Source1”节点。
现在应看到两个项已添加到该日志中。一个将具有指示它是信息性项的图标,另一个将具有指示它是一个错误的图标。
- 返回到该窗体,然后单击“读入项”按钮。
将收到两个提示:一个包含信息性项,而另一个包含错误项。
注意 如果多次单击“写入项”按钮,将收到更多提示。
测试清除日志
- 在窗体中,单击“清除日志”按钮。
- 在服务器资源管理器中,右击“NewLog1”节点,然后单击“刷新”。
现在应看到该日志不再包含项。
测试移除源字符串
- 在窗体中,单击“移除事件源”按钮。
- 单击“验证源”按钮。应收到显示 False 的提示,指示源 Source1 不再存在。
- 单击“写入项”按钮。
注意 此操作将允许您将项写入日志中,因为如果源当前不存在, WriteEntry 方法将设置它。
- 在服务器资源管理器中,右击“NewLog1”节点,然后单击“刷新”。应在该日志中看到两个项。
- 再次单击“验证源”按钮。应收到显示 True 的提示,指示源 Source1 存在。
- 作为可选操作,您可能还希望在测试时单击“DeleteLog”按钮。这将移除日志 NewLog1 和源 Source1,以便不对系统配置做永久更改。