问题标签 [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.
c# - EventSource - 无法获取要应用的方法签名更改
我正在使用 EventSource 登录 ETW。我们正在使用 .Net Framework 4.5。
由于我还处于开发初期,我将在我的 EventSource 子类中频繁更改方法签名。我真的不想每次进行更改时都增加版本。版本只是一个字节,所以我很快就会用完版本。
有没有一种方法可以强制 ETW 在不添加/更改版本属性的情况下识别签名更改?
感觉它可能与清单文件的生成有关,但我真的找不到很多关于如何在 v4.5 中完成的信息。过去似乎需要手动生成清单文件,现在它以某种方式神奇地生成了。
对此的任何帮助将不胜感激。
编辑:
当我更改签名时,日志看起来仍然像旧签名。例如,如果我的方法看起来像这样
稍后,如果我想添加另一个参数,例如
除非我增加 Version 属性,否则消息值不会显示在有效负载中。我希望 ETW 能够识别我更改的签名,而无需更改 Version 属性。
c# - EventSource/Enterprise Library Logging 缓存已删除的方法,(可能在 InstrumentationManifest 中!)
精简版
如果我改变这个...
对此...
...我仍然收到日志消息,但它们已损坏。
要么消息没有到达,要么它们被我当前项目中甚至不存在的缺失/删除/删除方法格式化!
由于某些未知原因,特定字符串“HardymanDatabaseLog”存在问题
我认为这可能归结为在某处出现的损坏的仪器清单。
请继续阅读以了解更多信息 ...!(谢谢:o))
加长版(附图)
我有一个EnterpriseLibrary.SemanticLogging
通过 nuget 包引用的简单控制台应用程序。
使用此处的示例代码,我添加了一个BasicLogger
类。
当我运行我的简单应用程序时...
SemanticLogging-svc.exe
...我在日志查看器控制台( )中得到以下响应
... 哪个是对的!
但是,如果我现在将EventSource
属性更新为[EventSource(Name = "HardymanDatabaseLog")]
,并将我的属性调整SemanticLogging-svc.xml
为也引用HardymanDatabaseLog
...
...然后我在日志查看器控制台中得到以下响应...
...这不仅丢失了第一条消息,而且损坏了第二条消息!
如果您仔细查看开头的EventId : 1
那行,您会看到它说Message : Application Started
...该消息来自何处、为何以及来自何处?!......甚至Level : Informational
有点错......我的代码有Level = Critical
!
BasicLogger
在这个问题开始之前,我在具有属性的类中创建了一个(早已删除)方法[Event(1, Message = "Application Started.", Level = EventLevel.Informational)]
,现在,每当我设置时,都会EventSource(Name="HardymanDatabaseLog")
调用这个幻像方法。
需要明确的是......我的应用程序中的任何地方都不再存在“应用程序启动”文本(我正在使用一个全新的项目)......这个错误的唯一原因是重用了“HardymanDatabaseLog”事件源名称。
到目前为止,这是我为尝试清除导致事情出错的损坏信息所做的工作:
- 重新启动我的电脑(标准!)
- 删除并重新添加对企业库的所有引用(问题在不同的解决方案之间仍然存在,因此它不能是应用程序/解决方案级别的设置)
- 停止并删除 perfmon > 数据收集器集 > 事件跟踪会话 > Microsoft-SemanticLogging-Etw-ConsoleEventSink
- 查看
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog
我的应用程序是否已注册(当然在注册表中的任何地方都找不到“HardymanDatabaseLog”) - 睡在上面
- System.Diagnostics.EventLog.DeleteEventSource("HardymanDatabaseLog")
- 清理/重建/清理/构建/清理/etc/etc 解决方案
- 在没有 Visual Studio 主机应用程序的情况下运行我的应用程序
这就是我尝试过但没有成功...
- 确定企业库是否保留配置数据
- 确定 .NET EventSource 是否保留配置数据
- 重新安装企业库(仅
install-packages.ps1
包含在下载中) - 用头敲键盘
非常感谢任何和所有帮助/建议。
更新
使用 JustDecompile,我在EventSource
代码中发现了一个方法,该方法使用了一个名为 a 的对象ManifestBuilder
。该方法似乎构建了一个<instrumentationManifest />
文档,该文档当然可以包含似乎潜伏在幻像方法中的所有信息。
也许有人可以阐明这些神奇文档在 .NET 和 Enterprise Library 的上下文中的存储位置?
更新 2
正如@Randy Levy 通过调查 SLAB 源发现的那样,可以通过删除 C:\Users\<UserName>\AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46EB56CADF
. 他的回答也与这个问题有关...... SLAB,进程外:更改事件源方法的签名会导致不正确的事件记录。
谢谢@Randy Levy!
events - ETW EventSource 未在 Windows Server 上记录事件
我在 Nuget 上使用 Microsoft EventSource Libary 1.1.25 编写了一个 ETW EventSource。EventSource 的目的是将事件发送到我们维护的安全应用程序的自定义事件日志。该代码在本地工作,但我们无法将事件写入服务器上的事件日志。
EventSource 被命名为(也类似)Company-Security,并将事件发送到 Admin Channel。在我的本地开发机器上,我可以使用 wevtutil 注册事件源清单,并在 Windows 事件查看器中查看带有管理日志的 Company-Security 文件夹。当我运行应用程序时,事件记录在事件日志中。
但是,当我将应用程序部署到测试服务器(运行 Windows Server 2012)时,事件日志记录不起作用。在我使用 wevtutil 注册清单后,该日志已创建并在事件查看器中可见,但名称略有不同。创建了一个名为 Company-Security/Admin 的文件夹,其中包含一个名为 Company-Security/Admin 的日志,位于该文件夹内。我还可以在服务器上运行 perfview 并查看创建的事件。但是,没有任何内容写入事件日志。我还在 EventSource 代码中添加了一些调试语句,可以看到 EventSource IsEnabled() 正在返回 true。
下面是我写的eventsource的基类和实现类的代码片段。
我已经研究并找不到任何解释为什么事件日志不能在服务器上工作,但在开发机器上工作。我想我错过了一些东西,但不确定是什么。
抽象基类:
事件源类:
linux - EventSource 登录单声道
我正在使用 EventSource 在我的库中记录事件。该库是跨平台的,这意味着它可以被 linux/mac 用户使用。我知道 EventSource 如何在 Windows 上工作。用户可以使用 PerfView 或 Logman 工具等工具查看默认日志,或者实现 EventListener 类将日志定向到不同的位置。
但是 EventListener 类在单声道上不可用。在 linux/mac 上默认 EventSource 记录的事件在哪里?是否有任何工具可以查看它们?
如果需要更多详细信息,请告诉我。
unit-testing - 如何对我自己的 EventSource 实现进行单元测试
我正在使用 System.Diagnostics.EventSource 进行语义日志记录(.net 4.5)。
我想创建适当的单元测试,以确保事件实际上是用适当的内容触发的。
我怎样才能做到这一点?
测试方法示例:
c# - 如何将用户定义的对象序列化为 WriteEvent?
从 MSDN 文档中,Write-event 仅支持 int 和 string 参数类型。我想将用户创建的 ct 传递给 Write-event,如何获得此功能?实现此功能的正确序列化程序是什么?
.net - 如何在没有管理员权限的情况下创建 EventSource?
我有一个场景,我必须在没有管理员权限的情况下创建事件源,因为应用程序需要在运行时执行它。
安装程序以管理员权限执行,所以我可以做些什么来修改需要修改的任何内容,以避免需要管理员权限。
有什么我可以改变的,比如注册表项的权限、安全策略或允许普通用户创建事件源的东西吗?
events - System.Diagnostics - 带有空消息的事件源
我正在使用 System.Diagnostics 使用 EventSource 获取一些消息,以将它们作为日志进行跟踪。似乎缺少一些信息,例如 EventMessage 和 Message(它们是空的),而 EventId 和 Level 设置正确。WriteEvent 方法是正确的(传递给每个事件方法的参数的数量和类型与传递给 WriteEvent() 的参数完全匹配)。特别是,我在 ServiceFabric 群集上使用 WAD 来收集 Azure 表存储上的跟踪。任何想法?
谢谢!
c# - EventSource 事件在 Windows 性能分析器中显示为空
我可以在 C# 控制台应用程序中使用EventSource成功生成 ETW 事件;但是,如果我将事件存储在 ETL 文件中并使用 Windows 性能分析器,则与有效负载值、事件名称和提供程序名称相对应的列显示为空。
问题
EventSource 是否有任何额外的配置允许填充 WPA 中的列?
笔记:
- 这里发布了另一个问题:“您如何查看 EventSource 使用 Windows 性能分析器创建的 ETW 事件?”,我相信这个问题不是我的重复,因为我可以看到代表 WPA 中事件的行,它只是事件是空的。
- 如果我使用 PerView.exe 分析 ETL,我可以看到该事件的原始数据存在
- 如果我使用手头的库从 C++ 创建事件,则生成的 ETW 事件会在 WPA 中正确显示
- 在 WPA 中有空列不是一个大问题,我真正的问题是用 C++ 编写的第二个应用程序期望事件具有有效负载并且事件名称无法识别事件。我相信 WPA 中的空列和不能识别事件的 C++ 应用程序是两个相关的症状,并且鉴于具有空列的 WPA 任何人都可以通过简单地运行我在下面描述的步骤来重现,这就是我提到的原因这个问题是我提出问题的主要症状。
最小代码:
查看 WPA 中的空行:
- 打开提升的 CMD
- logman 创建跟踪 MySession -p {56ff7ff6-0418-4501-945f-c12737bc1c70} -o MySession.etl
- logman 启动 MySession
- 运行 C# 控制台应用程序
- logman 停止 MySession
- 用WPA打开ETL,你会从代码中看到三个事件对应的三行,但是这些行是空的
- 使用 PerfView 打开 ETL,您将看到原始数据存在(您可以在选择事件时按 ALT+D 将事件转储到 PerfView 中的控制台)
c# - Microsoft TraceEvent - 如何登录到事件查看器
使用 Microsoft.Diagnostics.Tracing EventSource 库(不要误认为 System.Diagnostics.Tracing),可以通过向名为“Channel”的事件注释添加属性来将某些消息记录到事件查看器。但是,这会将输出转储到“Windows Logs\Application”区域。我怎样才能让它记录到 'Applications and Service Logs\MyApp\MyFeature' ?
示例代码: