我试图弄清楚方法中的最后一个参数(IDictionary<String, String>)如何EventListener.EnableEvents(EventSource, EventLevel, EventKeywords, IDictionary<String, String>)影响方法的行为.
我已经检查了MSDN文档,但描述不清楚,没有示例如何使用它.什么是事件的参数以及它们如何在字典中指定?如果有人可以举一个例子,那就不仅仅是完美了.
我正在使用Enterprise Library SLAB进行日志记录,但总是因为我正在收到错误的日期错误 使用未定义的关键字值0x1用于事件ApplicationStarted. 它正在编译正常但是当我们尝试使用以下行启用日志事件时抛出运行时错误
listener.EnableEvents(Logger.Log, EventLevel.LogAlways, Microsoft.Practices.EnterpriseLibrary.SemanticLogging.Keywords.All);
这是我的事件来源
public static readonly Logger Log = new Logger();
[Event(100, Level = EventLevel.Informational, Keywords = Keywords.Application, Task = Tasks.ApplicationStarted, Opcode = Opcodes.Start, Version = 1)]
public void ApplicationStarted()
{
if (this.IsEnabled(EventLevel.Informational, Keywords.Application))
{
this.WriteEvent(100);
}
}
[Event(101, Level = EventLevel.Informational, Keywords = Keywords.Application, Task = Tasks.ApplicationClosed, Opcode = Opcodes.Closed, Version = 1)]
public void ApplicationClosed()
{
if (this.IsEnabled(EventLevel.Informational, Keywords.Application))
{
this.WriteEvent(101);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用SLAB进程外在我的应用程序中记录ETW事件.
今天我在WcfTestClient.exe下托管的WCF服务中遇到了问题
当我将断点放入我的EventSource继承类的WriteEvent方法时,IsEnabled()返回false!所以没有事件写入我的控制台日志进程外:(
启动我的ConsoleEventSink时,我可以看到我的eventSource注册了LogAlways级别而没有注册MatchAnyKeyword属性
有没有想过检查这个问题有什么问题?
提前致谢
我为记录事件实现了一个事件源类.在多次更改记录事件的一种方法的签名(参数名称和参数类型)后,不再正确记录事件.例如,当记录事件时,不是使用当前参数名称设置Payload,而是使用用于先前版本方法的参数记录事件.例如:
方法的版本n:
[Event(5, Message = "Action: {0}",
Task = Tasks.PAGE,
Keywords = Keywords.USER_ACTION,
Level = EventLevel.Informational)]
public void LogAction(string action, string paramName)
{
this.WriteEvent(5, action, paramName);
}
Run Code Online (Sandbox Code Playgroud)
版本n + 1的方法:
[Event(5, Message = "Action: {0}",
Task = Tasks.PAGE,
Keywords = Keywords.USER_ACTION,
Level = EventLevel.Informational)]
public void LogAction(string action, string newParamName)
{
this.WriteEvent(5, action, newParamName);
}
Run Code Online (Sandbox Code Playgroud)
当为记录事件调用此方法时,将记录它们,并使用参数名称paramName而不是newParamName设置Payload值.
现在,问题是:如何清除"缓存",系统会忘记方法的旧版本,新方法可以正确记录事件?
LE:我用PerfView测试了日志记录.有趣的是,它正确地读取日志.我使用SemanticLogging-svc.exe再次测试,日志仍然显示不正确.看起来问题不在于记录事件,而在于阅读它们.