如何在 Windows 事件系统中创建日志名层次结构?

2024-01-11

  • 我正在使用企业库记录消息。
  • 我希望将其中一些(通常是错误和警告)传递到 Windows 事件系统。我今天通过 entlib.config 路由这些。

这个解决方案有效,到目前为止,效果很好。但是,我的需求超出了该解决方案所能提供的范围。我有多个安装应该记录到不同的日志,但我希望它们的名称在事件查看器中符合逻辑且直观。但是,Windows 事件系统不能有两个名称中前 8 个字符相同的类别。类别名称可以更长,但仅使用前 8 个字母来区分它们。如果发生这种情况,.Net 实际上会输出警告:

只有自定义日志名称的前八个字符是重要的, 并且系统上已经有另一个日志使用前八个 给定名称的字符。

目前,我必须求助于神秘的前缀,但我仍然面临着多个安装在重新调整日志名时相互“冲突”的危险,所以我需要一个更好的解决方案。

但是,在我计算机上的事件查看器中,我可以看到日志名也有层次结构 - 这是exactly我需要的。微软和思科显然已经找到了一种方法来做到这一点:

但是,如何创建这样一个日志记录层次结构,其中每个应用程序都可以安装多次?像这样:

CompanyName
  ApplicationName
    Installation1
    Installation2

.NET 4 答案

您看到的似乎是来自 Windows 事件跟踪 (ETW) 的通道。您可以在注册表中查看相关项目HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT.

要使用这些功能,您必须使用新的Windows 事件日志 http://msdn.microsoft.com/en-us/library/windows/desktop/aa385780%28v=vs.85%29.aspx取代的功能事件记录 http://msdn.microsoft.com/en-us/library/windows/desktop/aa363652%28v=vs.85%29.aspxAPI从Vista开始,看起来主要是针对C/C++开发的。看来其中一些内容是通过System.Diagnostics.Eventing 命名空间 http://msdn.microsoft.com/en-us/library/system.diagnostics.eventing.aspx.

我发现 ETW 的一个很好的概述是使用 ETW 改进调试和性能调整 http://msdn.microsoft.com/en-us/magazine/cc163437.aspx.

好消息是,您似乎可以做您想做的事。您将需要创建一个 XML 清单,其中包含提供程序信息以及将记录的事件。然后,您需要使用清单上的消息编译器(MC.EXE!)来创建标头、资源文件和日志记录类,然后注册提供程序。

如果你下载适用于 Windows 7 和 .NET Framework 4 的 Microsoft Windows SDK http://www.microsoft.com/en-us/download/details.aspx?id=8279你会发现在Samples\winbase\Eventing\Provider\Simple\CSharp子目录中包含一个 .NET 示例解决方案,它将引导您完成所有步骤。

虽然它确实满足您的层次结构要求并且有点酷,但对于典型的业务应用程序来说,这在复杂性方面可能有点过大了。此外,消息编译器生成的代码是不安全的代码,因此这也可能是负面的。

.NET 4.5 答案

在 .NET 4.5 中,使用 EventSource 类对 ETW 提供了更好的支持。看Windows 高速日志记录:使用 System.Diagnostics.Tracing.EventSource 在 C#/.NET 中进行 ETW https://web.archive.org/web/20190112075125/https://blogs.msdn.microsoft.com/vancem/2012/08/13/windows-high-speed-logging-etw-in-c-net-using-system-diagnostics-tracing-eventsource/进行介绍。 EventSource 现在还支持事件日志。看宣布推出 EventSource NuGet 包 – 写入 Windows 事件日志 https://web.archive.org/web/20150623021720/http://blogs.msdn.com/b/dotnet/archive/2013/08/09/announcing-the-eventsource-nuget-package-write-to-the-windows-event-log.aspx进行演练。基本上,在编译时会为每个 EventSource 生成清单和清单 DLL,并且可以使用 wevtutil.exe 注册它们。通过添加 EventSource 和事件日志通道支持,这种方法现在看起来简单且可行。

最后,对 ETW 感兴趣的人请注意,模式和实践团队有一个应用程序块语义记录应用程序块 http://blogs.msdn.com/b/agile/archive/2013/04/25/just-released-microsoft-enterprise-library-6.aspx可以使用ETW。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Windows 事件系统中创建日志名层次结构? 的相关文章

随机推荐

  • 应用 Angular Bootstrap 下拉示例

    我想将下拉菜单引入我的项目中 并且我从示例中获取了代码 下拉菜单如示例中所示 但当我单击它时没有任何反应
  • Bash 与 Dash 使用命令 `echo -ne "hello\n"` 的行为 [重复]

    这个问题在这里已经有答案了 我使用相同的命令得到了不同的行为echo ne hello n 与 bash 和破折号 见下文 bash c echo ne hello n hello dash c echo ne hello n ne hel
  • 如何在 Clojure 中停止 jetty 服务器?

    我正在使用ring 和clojure 编写一个Web 应用程序 我使用 jetty 适配器作为开发服务器 使用 emacs SLIME 作为 IDE 虽然wrap reload确实有帮助 但run jetty会阻止我的slime会话 我希望
  • 移动图像缓存大小限制?

    有人熟悉移动设备的完整列表及其浏览器的图像缓存限制吗 我找到了一份 iPhone 的参考资料 http www niallkennedy com blog 2008 02 iphone cache performance html http
  • 使用 Mongo C# 2.0 驱动程序替换嵌入文档

    我有一个包含嵌入单元数组的文档 如下所示 id ObjectId 5807c22e959ca231f0c48a75 Code Value Units id ObjectId 5807cc08959ca331f09c530e Code Foo
  • 如何在 PHP 5 中启用 XSLT 功能?

    我想使用 xslt 将 xml 文件打印为 HTML 嵌套列表 据我所知代码是正确的 但是我收到此错误 致命错误 调用未定义的函数 xslt create 我认为这意味着 xslt 功能尚未启用 如何在 PHP 中启用这些功能 是否有我需要
  • Snakemake:如何有效地使用配置文件

    我正在使用以下配置文件格式蛇形对于一些测序分析实践 我有大量样本 每个样本包含 2 个 fastq 文件 samples Sample1 XY fastq files SRR4356728 1 fastq gz fastq files SR
  • 使用 D 编程语言的 ncurses api

    我正在尝试使用神经网络自学人工智能 长话短说 我想创建一个简单的图形来显示使用 ncurses 的程序中发生的情况 找到了我正在使用的教程here http www ai junkie com ann evolved nnt1 html 我
  • 是否可以让 xUnit 创建的 ITestOutputHelper 在 AutoFixture 上下文中可用?

    是否可以让 xUnit 创建的 ITestOutputHelper 在 AutoFixture 上下文中可用 在我的集成测试中 我使用 Builder 类 其中包含一些常规操作的辅助方法 为了隐藏类创建的复杂性 我使用自定义 AutoDat
  • Elixir 函数参数中的双反斜杠是什么意思?

    我最近遇到了一个代码片段 例如 def loop ring pid self nil true do some code end 双反斜杠是什么意思 我用谷歌搜索发现http elixir lang org getting started
  • 将 Kubernetes 集群日志发送到 AWS Elasticsearch

    我有一个测试 Kubernetes 集群 并在 AWS 上创建了 elasticsearch 其中包括用于日志管理的 Kibana 端点 https search this is my es wuktx5la4txs7avvo6ypuuyr
  • 是否可以将脚本添加到您在脚本中创建的电子表格中?

    我知道这是一个很遥远的事情 但是 您知道是否可以将脚本附加到您在脚本中创建的电子表格中 伪代码版本是 function create spreadsheet new spreadsheet creates spreadsheet new s
  • 以编程方式设置值时的 jQuery-ui 滑块动画

    我正在使用一个jQuery ui 滑块 http jqueryui com demos slider 以及一些用于快速选择一组值的按钮 当用户单击这些按钮之一时 滑块将通过 slider method mySlider slider val
  • 自定义 SQL 函数和 Code First (EF 4.1)

    我在用着实体框架 4 1 RC和代码优先方法 如何调用自定义 SQL 函数 如果我使用Edm函数属性 我应该指定什么命名空间 EdmFunction Namespace GetAge public static int GetAge Per
  • “‘生成器’对象不可下标”错误

    当我尝试解决 Project Euler Problem 11 时 为什么会从代码的第 5 行收到此错误 for x in matrix p 0 for y in x if p lt 17 currentProduct int y int
  • AJAX 轮询频率 - 长轮询还是不长轮询?

    我正在构建一个需要相对恒定的数据库轮询的网页组件 我可以看到两种不同的方法 我想知道其中一种是否比其他更好 或者我是否缺少第三种选择 1 每 1 或 2 秒发送一次 AJAX 请求以检查更新 每次请求无论是否有新数据都会立即返回 2 触发单
  • Fortran 等价于 matlab find - 无需内存重复的切片矩阵的应用

    我在 matlab 中经常使用 find 命令 我想知道如何在 Fortran 中巧妙地翻译它以提取数组的切片 在 matlab 中 您可以使用逻辑或索引进行切片 但在 Fortran 中 您需要索引进行切片 我知道内部子程序 pack 等
  • 在情节提要中创建独立视图以编程方式使用

    我正在尝试创建和设计一个UIView使用故事板但将其包含在UIActionSheet以编程方式 这基本上是为了避免使用带有像素的 CoreGraphics 定位函数 在旧的 xcode 中 我记得可以将 UIView 拖到笔尖上 而无需任何
  • 填充在锚点中不起作用[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我的锚点内的文本没有填充 但在悬停时会应用填充 这就是为什么我的网络结构在悬停时会移动 请帮忙 锚链接 aelement
  • 如何在 Windows 事件系统中创建日志名层次结构?

    我正在使用企业库记录消息 我希望将其中一些 通常是错误和警告 传递到 Windows 事件系统 我今天通过 entlib config 路由这些 这个解决方案有效 到目前为止 效果很好 但是 我的需求超出了该解决方案所能提供的范围 我有多个