问题标签 [etw-eventsource]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
285 浏览

.net - 如何使用 Microsoft.Diagnostics.Tracing.EventSource 类记录服务发出的事件?

我们编写了一个类,负责记录从.NET Framework 4.6 的EventSource派生的事件。我们已经在 Web 应用程序中成功地使用了这种机制,但我们正在努力让它与作为服务运行的 Windows 应用程序一起工作。该服务是使用Installer Class 安装的。安装后,它显示在 services.msc 管理单元中,分配给本地系统帐户

要注册我们的 EventSource,我们使用带有参数的wevtutil 程序。im Manifestfilename.man打开eventvwr.msc管理单元会显示我们新注册的 EventSource。我们正在使用Debug 和 Operational通道来记录我们的事件。

但是,当我们通过在服务管理单元中发出启动命令来启动应用程序时,日志记录机制似乎无法正常工作。该应用程序不会在操作通道中生成任何条目。相反,它在调试通道中创建条目,但它在调试通道中创建的条目是应该写入操作通道的条目。为调试通道指定的条目将被忽略。

我们在应用程序中内置了调试模式模式,因此我们可以将其作为桌面应用程序运行,而无需安装服务。在此调试模式下运行应用程序时,事件记录机制完美无缺。

因此我们怀疑这是一个权限问题,阻止了我们的 Windows 服务写入事件日志。不过这似乎很奇怪,因为执行调试模式应用程序的用户没有运行该服务的本地系统帐户的特权。我们还没有找到解决这个问题的方法。wevtutil sl按照本文所述设置权限并没有产生预期的结果。

0 投票
1 回答
600 浏览

etw - 如何将 EventSource 添加到 Web 应用程序

我们终于在我们的服务结构集群中正确配置了 EventSource 和 ElasticSearch。现在我们有了想要将 EventSources 添加到与我们的服务结构应用程序交互的 Web 应用程序,以便我们可以在一个位置查看所有事件(应用程序日志)并通过 Kibana 过滤/查询。

我们的问题似乎与作为 exe 的服务结构应用程序和无状态的 .NET 4.6(不是 .net CORE)Web 应用程序之间的差异有关。在 service Fabric 中,我们将实例化管道的 using 语句放在 Program.cs 中并设置无限睡眠。

如何在 Web 应用程序中执行此操作?这是我们用于 EventSource 的非 ServiceFabric 实现的管道代码。这就是我们正在使用的:

我们可以在 using 语句中看到管道并将事件发送到 ElasticSearch,但不能在它之外。所以问题是:

  1. 我们如何/在哪里放置我们的管道使用语句用于 Web 应用程序?
  2. 我们是否需要在每次记录时实例化和销毁管道,或者是否有办法在无状态 Web 事件中重用该管道?这看起来会非常昂贵并且会损害性能。也许我们可以缓存管道?

就是这样,如果您需要澄清,请告诉我。我看到很多用于客户端应用程序的 doco,但对于 Web 应用程序来说却不多。

谢谢,格雷格

使用解决方案代码更新

诊断管道管道;

0 投票
1 回答
366 浏览

.net - (ETW) 通用组件中的 EventSource

我想知道您在将 EventSource 用于常见且可以在同一流程中多次使用的组件方面的经验。

一个简单的例子。我的共享组件是 TestQueue,我想在我的进程中使用它几次,并在 PerfView 中再次使用它来查看哪个事件属于哪个队列。

我想这样使用它:

这是我在 PerfView 中的内容:

在此处输入图像描述

这两个事件之间没有区别。我想知道如何识别它们,以便某些名称(字符串)或 ID 成为事件名称的一部分?我知道我可以使用任务对事件进行逻辑分组,但这不是我所期望的,特别是因为它们必须在事件源中预定义。Activity ID 在用例中也是一样的。

干杯!


实现两个 EventSource 的一种更好的方法是通过自定义实现的构造函数传递事件源名称。也许这就是这样做的方法:)

所以自定义事件源类没有 EventSource 属性,构造函数有事件源名称参数:

所以之前的使用示例变成了这样:

性能视图

0 投票
1 回答
1384 浏览

c# - 在 EventSource 中使用 System.Exception 对象

我正在尝试使用事件源 (Microsoft.Diagnostics.EventFlow.Inputs.EventSource) 创建由事件流 (Microsoft.Diagnostic.EventFlow) 处理的事件,并将其输出传递给 Application Insights (Microsoft.Diagnostics.EventFlow) .Outputs.ApplicationInsights)进行分析。

事件流库似乎要求我将完整的 System.Exception 对象传递给事件流,以便在 Application Insights 中成功地将其分类为异常事件。

这是我在事件流中为我的异常使用的过滤器:

这是我目前正在生成希望通过事件流处理的事件的方法。目前,这确实出现在应用程序洞察力中,但是我相信我的实现很糟糕,因为我在运行时在输出窗口中看到下面的消息。

Event 方法的参数与 WriteEvent 方法的参数不匹配。这可能会导致事件显示不正确。

这是触发日志事件的方法:

任何人都可以清楚地说明实现这一点的正确方法以及通过事件流和 Onto Application Insights 传递 System.Exception 对象的正确方法是什么。

非常感谢。

0 投票
1 回答
423 浏览

c# - 如何通过 WriteEventCore 在 EventSource 中存储 DateTime

这是我当前的代码:

但最后,在生成的事件中,如果我将 startDateTime 作为“8/30/2017 5:00:00 PM”提供给该方法,我会将“8/30/3617 5:00:00 PM”视为 startDateTime。它总是在一年中增加1600。

我尝试提供8 作为大小而不是 sizeof(DateTime) ,但我仍然得到相同的结果。如果我将日期更改为字符串并作为字符串传递给 writeeventcore,我会得到正确的日期值,如此处的示例所示。我在这里做错了什么?通过 WriteEventCore 传递 DateTime 的正确方法是什么?

0 投票
1 回答
89 浏览

.net - ETW:设置 EventSource 名称会产生 EventId 806/807

我正在使用 ETW。我正在运行控制台日志。当我实例化我的 EventSource 以尝试将我的事件记录到日志文件时,我收到 806/807 警告代码并且我的日志不会持续存在。(无论我是否添加了“EventSource”属性,都会生成这些警告。

但是,如果我使用默认构造函数,不传递我的事件源的名称并使用默认属性值,我的日志会按预期生成而不会发出警告

示例实现:

理想情况下,我希望避免将我的 EventSource 名称硬编码为属性,而只需使用可用的重载构造函数并将我的名称传递给构造函数。

我从以前的帖子中找到了一些有用的信息,但遗憾的是没有解决我的问题 使用 EventSource 记录 ETW 丢失事件的风险

0 投票
0 回答
294 浏览

.net - ETW 跟踪:在连续跟踪几天后,日志文件已损坏

  1. 我们使用 ETW 自定义事件源(继承自 Microsoft.Diagnostics.Tracing.EventSource,Microsoft.Diagnostics.Tracing.EventSource.Redist.1.1.28 来自 NUGET)来检测我们的应用程序。

  2. 我们的提供程序在可以捕获文件中的事件的会话中启用。下面是配置跟踪会话:

    • 流模式:文件

跟踪缓冲区

  • 缓冲区大小:512 KB
  • 最小缓冲区:200
  • 最大缓冲区:400
  • 冲洗计时器:0 秒

文件:

  • 日志模式:新文件(达到最大文件大小的新文件)停止条件:
  • 最大大小:11MB

    1. 最大事件速率约为每秒几百个事件。
    2. 我们使用 Windows 服务器 2012 SP1。

有时我们会看到生成的 ETL 文件大小为 11MB(或有时更大),但它的事件为零。这主要发生在系统以最大事件率运行几天的可靠性服务器上。一旦发生这种情况,此后的所有日志文件都为零事件,此后我们将丢失所有事件。

尝试在 Windows 性能分析器中打开日志时,会显示以下错误消息。

Windows 性能分析器错误

这个问题很少重现。这使得尝试不同的试验和错误变得困难。

尝试的解决方案(无效):

  1. 将 Min 和 Max 缓冲区的数量分别减少到 24 和 48。
  2. 将冲洗计时器引入 10 秒。当事件率低时,这有一个缺点是创建 11MB 的日志文件并且事件很少。

有人遇到过这样的问题吗?请帮助。

0 投票
0 回答
142 浏览

azure-service-fabric - 向 ServiceEventSource 添加新方法会禁用日志记录(Service Fabric 服务)

我正在尝试向 Service Fabric 服务(Web 应用程序、Web api 或无状态服务)中的 ServiceEventSource 类添加新方法,以将警告和异常与信息类型消息分开记录。

当我向 ServiceEventSource 类添加新方法时,它不会输出任何消息,并且 this.IsEnabled() 返回 false。开箱即用,如果我删除新添加的方法,ServiceEventSource 会按预期输出消息,并且 this.IsEnabled() 返回 true。

我正在关注使用 EventSource 的一般示例。例如,仅添加以下代码将导致 ServiceEventSource 停止记录:

我到处找,找不到任何关于这种意外行为的参考。

0 投票
2 回答
993 浏览

c# - Wix - 在 ComponentGroup 中添加带/不带 GUID 的组件

当我的应用程序想要退出时,通过 Windows 日志发生错误,我需要在我的安装程序中添加一个 EventSource,定义一个 EventMessageFile,它将是 .NET Framework 的事件日志消息文件(我正在遵循该解决方案:https:/ /stackoverflow.com/a/574055/6617804)。

在我的Component.wxs中,我在这个 ComponentGroup LogsComponents中添加了 Id LogsNet的组件:

当我尝试以这种方式添加它(不生成 GUID)时,它会导致该错误:

Component/@Guid 属性的值“*”对此组件无效,因为它不符合自动生成 guid 的条件。使用 Directory 作为 KeyPath 或包含 ODBCDataSource 子元素的组件不能使用自动生成的 guid。确保您的组件没有 Directory 作为 KeyPath,并将任何 ODBCDataSource 子元素移动到具有显式组件 guid 的组件。OptifuelInfomax_Installer (OptifuelInfomax_Installer\OptifuelInfomax_Installer) C:\Source\Infomax\OptiFuelInfomax\OptifuelInfomax_Installer\Components.wxs 80

当我在Tools -> Create GUID (Registry Format)中使用 Visual Studio生成 GUID时,它在错误列表中显示:

组件元素包含意外的属性“GUID”。OptifuelInfomax_Installer (OptifuelInfomax_Installer\OptifuelInfomax_Installer) C:\Source\Infomax\OptiFuelInfomax\OptifuelInfomax_Installer\Components.wxs 80

它还在 IDE 中说:不允许使用“GUID”属性。

我应该为该组件使用 GUID 吗?

0 投票
0 回答
79 浏览

etw-eventsource - 如何在 EventSource 中记录多个字段

我正在使用 EventSource 来记录事件。我需要为一个事件记录 30 个字段。如果我将所有 30 个字段作为字符串一一传递,如下所示。我能够记录这些事件。但是当我试图将 a 传递string[]WriteEvent(). isEnabled()返回错误。有没有更好的方法将多个字段传递给WriteEvent()方法?

以下是我的事件提供程序的源代码。

谢谢!