如何写入自定义 Windows 事件日志?

Gre*_*g D 4 .net event-log custom-eventlog

我正在尝试在 .net 中设置基本日志记录到 .net 中的 Windows 事件日志System.Diagnostics.EventLog,但我没有看到任何实际写入日志的事件。考虑以下代码:

// Elsewhere in the class
private static readonly string EventLogName = "LogName";
private static readonly string EventLogSource = "AppName";

// In the only function that does something
if (!EventLog.Exists(EventLogName))
{
    EventLog.CreateEventSource(EventLogSource, EventLogName);
    return;
}
else
{
    Trace.TraceInformation("Attempting log");

    // This doesn't write anything
    EventLog.WriteEntry(EventLogSource, 
        "StaticWriteEntry", 
        EventLogEntryType.Error);

    // Neither does this
    using (var log = new EventLog())
    {
        log.Log = EventLogName;
        log.Source = EventLogSource;
        log.WriteEntry("WriteEntry?", EventLogEntryType.Error);
    }
}
return;
Run Code Online (Sandbox Code Playgroud)

根据 MSDN 示例,我第一次创建日志并退出应用程序。当然,此日志创建最终将进入设置。后续运行尝试将消息记录到创建的事件日志中。

没有抛出异常。日志似乎已成功创建(我可以在 Windows 事件查看器中打开它)。安全日志中没有记录任何相关内容。

没有消息通过任何一个记录WriteEntry()。由于名称不匹配,它们也不会被放置在应用程序日志中。在这种特殊情况下,我在禁用 UAC 的管理员帐户中运行 Server2008。(这是需要不幸环境的较大遗留产品的一小部分。)我做错了什么?

(我这样做是因为我想EventLogTraceListener在我的 app.config 中使用 an ,它没有写任何东西,所以这是解决该问题的一部分。)

Gre*_*g D 5

问题似乎与源名称有关。具体来说,如果我更改源名称,则可以成功写入。这是由于EventLog.Source文档底部的以下行:

如果源已映射到日志,而您将其重新映射到新日志,则必须重新启动计算机以使更改生效。

在开发过程中,日志名和日志源被创建和销毁了几次,我可能在没有更改源名称的情况下更改了日志名。

假设我的原始来源和日志是"OldSource""OldLog"。通过更改代码以尝试写入"NewSource"和,我确定这可能是问题的根源"NewLog"。当我更改两者时,我成功创建并写入"NewLog". 然而,当我尝试"NewLog"通过创建它来写入"OldSource"时,它失败了。

我确认这是问题所在,然后重新启动我的开发系统并运行完全相同的代码(使用"NewLog""OldSource")并且它起作用了。

我想这是重新启动确实解决了它的一次!:)