Win7:从事件源取消注册事件日志

时间:2012-02-02 20:34:33

标签: c# .net

前段时间我跟着MSDN如何编写Windows服务的例子。它包括以下代码:

    public Monitor_Processes()
    {
        InitializeComponent();
        if (!System.Diagnostics.EventLog.SourceExists("Monitor_Processes"))
        {
            System.Diagnostics.EventLog.CreateEventSource("Monitor_Processes", "Monitor_Processes_Log");
        }
        eventLog1.Source = "Monitor_Processes";
        eventLog1.Log = "Monitor_Processes_Log";
    }

安装好了,但是启动服务时出错了。当我检查事件日志时,它说:“源'Monitor_Processes'未在日志'Monitor_Processes_Log'中注册。(它在日志'Application'中注册。)”

我已将代码更改为如下所示:

    public Monitor_Processes()
    {
        InitializeComponent();
        if (!System.Diagnostics.EventLog.SourceExists("Monitor_Processes"))
        {
            System.Diagnostics.EventLog.CreateEventSource("Monitor_Processes", "");
        }
        eventLog1.Source = "Monitor_Processes";
    }

但是现在,在尝试启动服务时仍然会出现相同的错误(错误消息仍然指的是“Monitor_Processes_Log”) - 即使在卸载和重新启动之后也是如此。

如何重新开始并将我的源注册到应用程序日志(假设我的服务将成功启动)?

1 个答案:

答案 0 :(得分:1)

您应该删除源

System.Diagnostics.EventLog.DeleteEventSource("Monitor_Processes");

作为附注,我建议您不要尝试检查源是否存在并在执行服务期间创建它。 EventLog.SourceExists()方法需要Windows 7和Windows Server 2008 R2上的管理权限,因为它会尝试检查安全日志。您应该在ServiceInstaller课程中添加这些检查/创建语句。

如果可能,请不要让您的Windows服务需要本地管理员。

编辑:要手动创建事件日志源,您也可以使用PowerShell。

param (
    $logName = "Application",
    $source = $(Read-Host -prompt "Enter EventLog source"),
    $machineName = ".",
    [switch]$verbose
)

function createEventSource() {
    if (![System.Diagnostics.EventLog]::SourceExists($source, $machineName)) {
        [System.Diagnostics.EventLog]::CreateEventSource($source, $logName, $machineName)  
         Write-VerboseHost "Created source $source in log $logName."
    } else {
         Write-VerboseHost "Source $source in log $logName already exists."
    }
}

function help() {
    "Usage: Create-EventSource -source string [-machineName string] [-verbose]"
    exit
}

function Write-VerboseHost($message) {
    if ($verbose) {
        Write-Host $message
    }
}

if (!$source) { help }