【问题标题】:Writing to the event log with hierarchy写入具有层次结构的事件日志
【发布时间】:2014-08-29 07:40:57
【问题描述】:

我知道在 SO 上有很多关于写给事件查看器的主题,但我没有找到我需要的。

我有以下代码在事件查看器中创建一个新的事件日志类别:

string sSource = "MyWebService";
string sLog = "My Application";
string sMsg = "Error Message Goes here";

if (!EventLog.SourceExists(sSource))
{ EventLog.CreateEventSource(sSource, sLog); }

这按预期工作,在事件查看器中,我有以下输出:

所以,写入事件查看器不是问题,但是当我想在日志中创建一些层次结构时,就会出现问题

所以,假设我编写了一个由各种组件组成的应用程序:

- MVC
- Web API
- Windows Service

然后在事件查看器中,我想创建一个包含所有这些元素的字典,就像 Microft 所做的那样:

这意味着我想要一个如下所示的输出:

- Application (directory)
    - MVC (directory)
        - Others (logs)
    - Web API (directory)
        - Demo (logs)
    - Windows Service (directory)
        - Authentication (logs)

我已尝试执行以下操作:

string sSource = "MyWebService";
string sLog = "My Application";
string sMsg = "Error Message Goes here";

if (!EventLog.SourceExists(sSource))
{ EventLog.CreateEventSource(sSource, sLog); }

if (!EventLog.SourceExists(sLog))
{ EventLog.CreateEventSource(sLog, "Web Service"); }

当然,这没有用。

有人知道如何在事件查看器中创建层次结构吗?

重要的是:我喜欢完全控制我的代码,所以我不想使用任何第三方库。

【问题讨论】:

    标签: c# event-log event-viewer


    【解决方案1】:

    要执行所需的操作,您需要使用 Windows 事件跟踪 (ETW)。在 .NET 中,您可以使用 EventSource 类,但我建议您使用更新的 NuGet 包:Microsoft EventSource Library。还有一个带有示例的 NuGet 包,如果您是 ETW 新手,它应该是一个很好的起点。

    除了创建写入事件日志的代码之外,您还需要创建清单和关联的资源 DLL。 NuGet 包有一个工具,可以根据您在代码中创建的日志事件自动执行此过程。然后您需要使用wevtutil 命令行工具注册事件源。

    【讨论】:

    • 感谢您的回答,但正如我的问题所述,我想控制我的代码,这意味着我想避免使用包。我可以稍后使用包,但首先我想知道它是如何工作的。 :-)
    • @Complexity:那么,祝你好运,使用 P/Invoke 调用本机 ETW API。我看过EventSource 代码,它非常复杂。要做你想做的事,你仍然需要使用 ETW,这里是 API 文档的链接:msdn.microsoft.com/en-us/library/windows/desktop/…
    • 嗯,不喜欢做 P/Invoke,所以我可能会使用 nuget 包。
    • @Complexity:EventSource 类也是 .NET 框架的一部分。但是,NuGet 包包含更新且可能更好的库版本。预计将有越来越多的 Microsoft 库通过 NuGet 而不是在框架中提供。
    • 谢谢,我去看看包裹。因为它来自 Microsft,所以我使用它没有什么大问题 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多