EventLog 类

提供与 Windows 事件日志的交互。

**命名空间:**System.Diagnostics
**程序集:**System(在 system.dll 中)

语法

声明
Public Class EventLog
    Inherits Component
    Implements ISupportInitialize
用法
Dim instance As EventLog
public class EventLog : Component, ISupportInitialize
public ref class EventLog : public Component, ISupportInitialize
public class EventLog extends Component implements ISupportInitialize
public class EventLog extends Component implements ISupportInitialize

备注

EventLog 使您可以访问或自定义 Windows 事件日志,事件日志记录关于重要的软件或硬件事件的信息。通过 EventLog,可以读取现有日志,向日志中写入项,创建或删除事件源,删除日志,以及响应日志项。也可在创建事件源时创建新日志。

Note重要事项:

创建一个 EventLog 对象,写入一个项,然后通过将 EventLog 对象传递到部分受信任的代码可以创建一个安全问题。从不将任何事件日志对象(包括 EventLogEntryEventLogEntryCollection 对象)传递到受信任程度较低的代码。

Note重要事项:

在 .NET Framework 1.0 版和 1.1 版中,此类要求直接调用方是完全信任的调用方。在 2.0 版中,此类需要 EventLogPermission 才能用于特定操作。强烈建议不要向部分受信任代码授予 EventLogPermission。如果代码具有读取或写入事件日志的能力,则可以执行诸如以其他应用程序的名义发布事件日志消息的操作。

Note重要事项:

创建或删除事件源时需要通过使用命名 Mutex 同步执行基础代码。如果具有高权限的应用程序锁定该命名 Mutex,则尝试创建或删除事件源会导致应用程序停止响应,直到释放该锁为止。若要避免此问题,请不要为不受信任的代码授予 UnmanagedCode 权限。此外,UnmanagedCode 权限还允许忽略其他权限,应仅授予高度受信任的代码。

若要从日志中读取,请为 EventLog 指定 Log 名称和 MachineName(服务器计算机名称)。不需要指定 Source,因为只有写入日志时才需要源。Entries 成员由事件日志的项列表自动填充。

提示

如果是通过指定 Log/MachineName 对连接到日志,则不需要指定 MachineName。如果不指定 MachineName,则假定为本地计算机“.”。

如果写入事件日志,必须指定或创建一个 Source 事件。若要创建新的事件源,您必须拥有计算机的管理员权限。Source 在事件日志中将您的应用程序注册为有效的项源。使用 Source 一次只能写入一个日志。Source 可以为任何随机字符串,但其名称必须不同于计算机上的其他源。源通常是应用程序或另一个标识字符串的名称。创建重复的 Source 值的尝试将引发异常。但是,单个事件日志可以与多个源关联。

提示

没有任何措施可以保护应用程序不被作为任何注册源而写入。如果向应用程序授予 Write 权限,该应用程序可以为计算机上注册的任何有效源写入事件。

应用程序和服务应写入 Application 日志或自定义日志。设备驱动程序应写入 System 日志。如果不显式设置 Log 属性,事件日志会默认为 Application 日志。

提示

Security 日志是只读的。

使用 WriteEventWriteEntry 向事件日志中写入事件。若要写入事件,必须指定一个事件源;在事件源中写入第一项之前,必须先创建并配置事件源。

在安装应用程序的过程中创建新的事件源。这样操作系统就有时间刷新已注册的事件源的列表以及这些事件源的配置。如果操作系统尚未刷新自己的事件源列表,而您试图在新源中写入事件,则写操作将会失败。您可以使用 EventLogInstaller 或者使用 CreateEventSource 方法配置新的源。若要创建新的事件源,您必须拥有计算机的管理员权限。

每个源一次只能写入一个事件日志;但是,应用程序可以使用多个源写入多个事件日志。例如,应用程序可能会要求您为不同的事件日志或资源文件配置多个源。若要更改现有源的配置详细信息,必须先删除现有源,然后使用新的配置重新创建源。如果其他应用程序或组件使用现有源,则应使用更新的配置创建新源,而不要删除现有源。

您可以使用本地化的资源为事件类别和消息字符串注册事件源。您的应用程序可使用资源标识符而不是通过指定实际字符串值来写入事件日志项。有关使用资源文件配置源的更多信息,请参考 EventLogInstallerEventSourceCreationData 类。

如果您的应用程序将字符串值直接写入事件日志,则不需要为该源设置资源文件属性。无论要写入本地化后的项还是要直接写入字符串,都必须配置源。如果应用程序写入项时既使用资源标识符也使用字符串值,则必须注册两个不同的源。例如,用资源文件配置一个源,然后在 WriteEvent 方法中使用该源,将使用资源标识符的项写入到事件日志。然后,另外创建一个不带资源文件的源,并在 WriteEntry 方法中使用该源,直接将字符串写入到使用该源的事件日志。

写入事件时,您必须至少指定一个消息字符串或消息字符串的资源标识符。其他事件属性是可选的。可选事件设置的示例包括以下内容:您可以设置 EventLogEntryType 以指定事件查看器为该项显示的图标;如果您的应用程序使用类别筛选事件,则可以为该事件指定类别标识符;并且,如果需要将其他信息与给定事件相关联,您还可以向事件项中附加二进制数据。

除了访问个别的事件日志及其项外,EventLog 类还提供了对所有事件日志的集合的访问。您可以使用 EventLogstatic 成员删除日志、获取日志列表、创建或删除源,或者确定计算机是否已经包含特定的源。

有三种默认事件日志:Application、System 和 Security。已安装的其他应用程序和服务(如 Active Directory)可以有附加的事件日志。可使用 EventLog 创建可通过服务器的事件查看器查看的自定义事件日志。使用 RegisterDisplayName 方法在事件查看器中显示您的事件日志的本地化名称。使用 ModifyOverflowPolicy 方法配置当您的事件日志达到其最大日志大小时的行为。

事件日志占用磁盘空间、处理器时间和其他系统资源。仅记录基本信息很重要。建议将事件日志调用放在错误路径中,而不是放在主代码路径中,以免对性能造成不利影响。

有关 EventLog 的实例的初始属性值列表,请参见 EventLog 构造函数。

Windows 98, Windows Millennium Edition 平台说明: Windows 98 或 Windows Millennium Edition (Me) 上不支持事件日志。

示例

下面的示例创建源 MySource(如果尚未存在),并在事件日志 MyNewLog 中写入一项。

Option Explicit
Option Strict

Imports System
Imports System.Diagnostics
Imports System.Threading

Class MySample
    Public Shared Sub Main()
        
        ' Create the source, if it does not already exist.
        If Not EventLog.SourceExists("MySource") Then
            EventLog.CreateEventSource("MySource", "MyNewLog")
            Console.WriteLine("CreatingEventSource")
        End If
        
        ' Create an EventLog instance and assign its source.
        Dim myLog As New EventLog()
        myLog.Source = "MySource"
        
        ' Write an informational entry to the event log.    
        myLog.WriteEntry("Writing to event log.")
    End Sub 'Main 
End Class 'MySample
using System;
using System.Diagnostics;
using System.Threading;
              
class MySample{

    public static void Main(){
    
        // Create the source, if it does not already exist.
        if(!EventLog.SourceExists("MySource")){
            EventLog.CreateEventSource("MySource", "MyNewLog");
            Console.WriteLine("CreatingEventSource");
        }
                
        // Create an EventLog instance and assign its source.
        EventLog myLog = new EventLog();
        myLog.Source = "MySource";
        
        // Write an informational entry to the event log.    
        myLog.WriteEntry("Writing to event log.");
        
    }
}
   
#using <System.dll>

using namespace System;
using namespace System::Diagnostics;
using namespace System::Threading;
int main()
{
   
   // Create the source, if it does not already exist.
   if (  !EventLog::SourceExists( "MySource" ) )
   {
      EventLog::CreateEventSource( "MySource", "MyNewLog" );
      Console::WriteLine( "CreatingEventSource" );
   }

   
   // Create an EventLog instance and assign its source.
   EventLog^ myLog = gcnew EventLog;
   myLog->Source = "MySource";
   
   // Write an informational entry to the event log.    
   myLog->WriteEntry( "Writing to event log." );
}
import System.*;
import System.Diagnostics.*;
import System.Threading.*;

class MySample
{
    public static void main(String[] args)
    {
        // Create the source, if it does not already exist.
        if (!(EventLog.SourceExists("MySource"))) {
            EventLog.CreateEventSource("MySource", "MyNewLog");
            Console.WriteLine("CreatingEventSource");
        }

        // Create an EventLog instance and assign its source.
        EventLog myLog = new EventLog();
        myLog.set_Source("MySource");

        // Write an informational entry to the event log.    
        myLog.WriteEntry("Writing to event log.");
    } //main 
} //MySample

继承层次结构

System.Object
   System.MarshalByRefObject
     System.ComponentModel.Component
      System.Diagnostics.EventLog

线程安全

此类型的任何公共静态(Visual Basic 中的 Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。

平台

Windows 98、Windows 2000 SP4、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition

.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求

版本信息

.NET Framework

受以下版本支持:2.0、1.1、1.0

请参见

参考

EventLog 成员
System.Diagnostics 命名空间
EventLogInstaller
EventLogEntry
EntryWrittenEventArgs 类
ServiceBase

其他资源

记录应用程序、服务器和安全性事件