基于事件写入日志文件

当发生指定事件时,LogFileEventConsumer 类可以将预定义文本写入日志文件。 此类是 WMI 提供的标准事件使用者。

使用标准使用者的基本过程始终相同,并且位于使用标准使用者监视和响应事件中。

以下程序是对基本过程的补充;特定于 LogFileEventConsumer;并描述了如何创建运行程序的事件使用者。

创建写入日志文件的事件使用者

  1. 在托管对象格式 (MOF) 文件中,创建一个 LogFileEventConsumer 的实例来接收在查询中请求的事件,在 Name 属性中命名该实例,然后将日志文件的路径放置在 Filename 属性中。

    有关详细信息,请参阅设计托管对象格式 (MOF) 类

  2. 在 Text 属性中提供要写入日志文件的文本模板。

    有关详细信息,请参阅使用标准字符串模板

  3. 创建 __EventFilter 的实例,并定义一个查询来指定将激活使用者的事件。

    有关详细信息,请参阅利用 WQL 进行查询

  4. 创建 __FilterToConsumerBinding 的实例,将筛选器与 LogFileEventConsumer 的实例相关联。

  5. 若要控制谁读取或写入日志文件,请将日志所在目录的安全性设置为所需级别。

  6. 使用 Mofcomp.exe 编译 MOF 文件。

示例

本节中的示例在 MOF 代码中,但可以通过使用适用于 WMI 的脚本 API适用于 WMI 的 COM API 以编程方式创建实例。 该示例使用标准 LogFileEventConsumer 创建名为 LogFileEvent 的使用者类,当创建类 LogFileEvent 的实例时,该类会向 c:\Logfile.log 文件写入一行。

以下过程介绍如何使用示例。

使用示例

  1. 将下面的 MOF 列表复制到文本文件中,并使用 .mof 扩展名保存该文件。

  2. 在命令窗口中,使用以下命令编译 MOF 文件。

    Mofcomp filename**.mof**

  3. 打开 Logfile.log,以查看由 LogFileEvent.Name: "Logfile Event Consumer event" 指定的行。

// Set the namespace as root\subscription.
// The LogFileEventConsumer is already compiled 
//     in the root\subscription namespace. 

#pragma namespace ("\\\\.\\Root\\subscription")

class LogFileEvent
{
    [key]string Name;
};

// Create an instance of the standard log
// file consumer and give it the alias $CONSUMER

instance of LogFileEventConsumer as $CONSUMER
{
    // If the file does not already exist, it is created.
    Filename = "c:\\Logfile.log";  
    IsUnicode = FALSE;
    // Name of this instance of LogFileEventConsumer
    Name = "LogfileEventConsumer_Example";  
    // See "Using Standard String Templates"; 
    Text = "%TargetInstance.Name%"; 
    // TargetInstance is the instance of LogFileEvent 
    //    requested in the filter        
                                         
};

// Create an instance of the event filter 
// and give it the alias $FILTER
// Query for any instance operation type,
// such as instance creation, for LogFileEvent class

instance of __EventFilter as $FILTER
{
    Name = "LogFileFilter";
    Query = "SELECT * FROM __InstanceOperationEvent "
        "WHERE TargetInstance.__class = \"LogFileEvent\"";
    QueryLanguage = "WQL";
};

// Create an instance of the binding.

instance of __FilterToConsumerBinding
{
    Consumer=$CONSUMER;
    Filter=$FILTER;
 DeliverSynchronously=FALSE;
};

// Create an instance of this class right now
// Look at the file c:\Logfile.log to see
// that a line has been written.

instance of LogFileEvent
{
 Name = "Logfile Event Consumer event";  
};

使用标准使用者监视和响应事件