EventEntry 的架构未使用进程外语义日志记录更新
The schema of EventEntry was not updated using out-of-process semantic logging
我编写了一个自定义事件源 class 并添加了一个日志方法,如下所示:
[EventSource(Name = "MyCompany")]
public class MyCompanyEventSource : EventSource
{
[Event(6, Message = "test.", Keywords = Keywords.Perf,
Level = EventLevel.Warning)]
public void Test()
{
this.WriteEvent(6);
}
}
并且我使用了 SemanticLogging-svc.exe -c 来启动跟踪事件服务,在执行这个命令之前我还将 SemanticLogging-svc.xml 配置为
<eventSource name="MyCompany" level="LogAlways"/>
然后我开始调用 Test() 方法。 flatFileSink 第一次将事件的正确级别记录为警告。但是,当我将属性中的Test()方法的级别更改为Critical并调用Test()方法后,flatFileSink仍然会记录级别为Warning。这是完全错误的!我知道这是 EventEntry 的模式,它是 OnNext 方法参数。但是,如果我使用进程内侦听器,则级别可以更新为 Critical,这是正确的。
那么,为什么我用进程外的关卡还是原来的关卡呢?这是 ETW 的问题吗?看起来机器中有一些缓存。并且无论在Performance Monitor中停止和删除Event Trace Session,还是重新启动计算机,都无法清除此缓存。我真的很想清除这个缓存,但我不知道该怎么做。
而且我知道,如果我更改了事件属性中的版本或将事件源名称更改为其他名称,则进程外的级别将会更新。但我认为这不是一个好方法,因为我们可能会忘记更改版本。
那么,有人可以帮助我吗?
理论上,更新 Event
属性的 Version
属性 应该可以解决问题。强调应该.
它并不总是有效,您的 EventSource
的模式存储在一个秘密的魔法未记录位置,如果 etw 喜欢它,它会在某个时候以某种方式更新。重新启动甚至没有帮助。
问题源于进程外记录器缓存事件源的清单:TraceEventManifestsCache。
此缓存将清单 XML 写入使用以下路径生成的临时目录:
Path.Combine(Path.GetTempPath(), "7D2611AE-6432-4639-8B91-3E46EB56CADF");
Path.GetTempPath()
的值取决于服务 运行 的用户,以及您 运行 使用的 Windows 的版本。在此临时目录中,您可以找到缓存的清单。
该服务并未明确说明它在什么条件下刷新缓存的清单,但它似乎并不总是在您期望的时候触发。
如果您删除清单的缓存文件,将强制提供商获取新版本的清单。您应该重新启动服务以使其立即获取清单。
我编写了一个自定义事件源 class 并添加了一个日志方法,如下所示:
[EventSource(Name = "MyCompany")]
public class MyCompanyEventSource : EventSource
{
[Event(6, Message = "test.", Keywords = Keywords.Perf,
Level = EventLevel.Warning)]
public void Test()
{
this.WriteEvent(6);
}
}
并且我使用了 SemanticLogging-svc.exe -c 来启动跟踪事件服务,在执行这个命令之前我还将 SemanticLogging-svc.xml 配置为
<eventSource name="MyCompany" level="LogAlways"/>
然后我开始调用 Test() 方法。 flatFileSink 第一次将事件的正确级别记录为警告。但是,当我将属性中的Test()方法的级别更改为Critical并调用Test()方法后,flatFileSink仍然会记录级别为Warning。这是完全错误的!我知道这是 EventEntry 的模式,它是 OnNext 方法参数。但是,如果我使用进程内侦听器,则级别可以更新为 Critical,这是正确的。
那么,为什么我用进程外的关卡还是原来的关卡呢?这是 ETW 的问题吗?看起来机器中有一些缓存。并且无论在Performance Monitor中停止和删除Event Trace Session,还是重新启动计算机,都无法清除此缓存。我真的很想清除这个缓存,但我不知道该怎么做。
而且我知道,如果我更改了事件属性中的版本或将事件源名称更改为其他名称,则进程外的级别将会更新。但我认为这不是一个好方法,因为我们可能会忘记更改版本。
那么,有人可以帮助我吗?
理论上,更新 Event
属性的 Version
属性 应该可以解决问题。强调应该.
它并不总是有效,您的 EventSource
的模式存储在一个秘密的魔法未记录位置,如果 etw 喜欢它,它会在某个时候以某种方式更新。重新启动甚至没有帮助。
问题源于进程外记录器缓存事件源的清单:TraceEventManifestsCache。
此缓存将清单 XML 写入使用以下路径生成的临时目录:
Path.Combine(Path.GetTempPath(), "7D2611AE-6432-4639-8B91-3E46EB56CADF");
Path.GetTempPath()
的值取决于服务 运行 的用户,以及您 运行 使用的 Windows 的版本。在此临时目录中,您可以找到缓存的清单。
该服务并未明确说明它在什么条件下刷新缓存的清单,但它似乎并不总是在您期望的时候触发。
如果您删除清单的缓存文件,将强制提供商获取新版本的清单。您应该重新启动服务以使其立即获取清单。