EventEntry的模式未使用进程外语义日志记录进行更新

时间:2015-08-12 18:38:29

标签: etw out-of-process semantic-logging

我编写了一个自定义的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方法参数。但是如果我使用进程内侦听器,则该级别可以更新为Critical,这是正确的。

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

我知道如果我更改了事件属性中的版本或将EventSource名称更改为另一个,则会更新进程外的级别。但这并不是我想的好方法,因为我们可能忘记更改版本。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

该服务不清楚它在什么条件下刷新缓存清单,但是它似乎并不总是在您预期时触发。

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

答案 1 :(得分:0)

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

它并不总是有效,你的EventSource的模式存储在一个秘密的魔法未记录的位置,如果感觉像这样,它会在某个时刻以某种方式更新。重新启动甚至没有帮助。