0

我编写了一个自定义 EventSource 类并添加了一个日志方法,如下所示:

[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 来启动跟踪事件服务,在执行这个 cmd 之前我还将 SemanticLogging-svc.xml 配置为

<eventSource name="MyCompany" level="LogAlways"/>

然后我开始调用 Test() 方法。flatFileSink 将第一次将事件的正确级别记录为警告。但是,在我将属性中的Test()方法的级别更改为Critical并调用Test()方法后,flatFileSink仍然会将级别记录为Warning。这是完全错误的!我知道这是 EventEntry 的架构,它是 OnNext 方法参数。但是如果我使用进程内监听器,级别可以更新为正确的关键。

那么,如果我使用进程外,为什么级别仍然是旧级别?ETW有什么问题吗?看起来机器中有一些缓存。并且无论是在性能监视器中停止和删除事件跟踪会话,还是重新启动计算机,都无法清除此缓存。我真的很想清除这个缓存,但我不知道怎么做。

而且我知道,如果我更改了 Event Attribute 中的 Version 或将 EventSource Name 更改为另一个,则会为进程外更新级别。但我认为这不是一个好方法,因为我们可能忘记更改版本。

那么,有人可以帮助我吗?

4

2 回答 2

1

问题源于进程外记录器缓存事件源的清单:TraceEventManifestsCache

此缓存将清单 XML 写入使用以下路径生成的临时目录:

Path.Combine(Path.GetTempPath(), "7D2611AE-6432-4639-8B91-3E46EB56CADF");

的值Path.GetTempPath()取决于运行服务的用户,以及运行的 Windows 版本。在这个临时目录中,您可以找到缓存的清单。

该服务没有明确说明它在什么条件下刷新缓存的清单,但是它似乎并不总是在您期望的时候触发。

如果您删除清单的缓存文件,它将强制提供程序获取清单的新版本。您应该重新启动服务以使其立即获取清单。

于 2016-01-28T21:00:42.210 回答
0

理论上,更新Version属性的Event属性应该可以解决问题。强调应该

它并不总是有效,您的架构存储在一个秘密的魔法无证位置,如果觉得它EventSource会在某个时候以某种方式更新。重新启动甚至没有帮助。

于 2015-09-05T03:40:21.903 回答