我正在使用System.Diagnostics使用EventSource获取一些消息,以将它们作为日志进行跟踪。似乎缺少一些信息,例如EventMessage和Message(它们是空的),而EventId和Level是正确设置的。 WriteEvent方法是正确的(传递给每个事件方法的参数的数量和类型与传递给WriteEvent()的参数的数量和类型完全匹配)。 特别是,我在ServiceFabric群集上使用WAD来收集Azure表存储上的跟踪。 有什么想法吗?
谢谢!
答案 0 :(得分:0)
Event的参数必须与您调用的方法的参数匹配。 Eventsource根据方法的参数构建清单。
事件方法必须完全匹配它调用的WriteEvent重载的类型,特别是你应该避免隐式标量转换;它们是危险的因为清单是根据ETW事件方法的签名生成的,但传递给ETW的值是基于WriteEvent重载的签名。
答案 1 :(得分:0)
自从我们升级到大于4.5.2的任何.NET Framework版本以来,我遇到了这个问题。我终于弄明白了我的问题,希望这对你也有帮助。我知道这是一个很老的帖子,但也许它会帮助其他人。
似乎Windows事件跟踪(ETW)处理错误,您获得的唯一指示是您所看到的记录消息为空的位置。我正在使用从IEventTextFormatter派生的自定义格式化程序。 (EventData.FormattedMessage为null)。在此方法中设置断点显示EventData.FormattedMessage为null。我还在Visual Studio的输出/调试窗口中注意到以下消息:
The parameters to the Event method do not match the parameters to the WriteEvent method. This may cause the event to be displayed incorrectly.
EventSourceException while processing event "WriteLogDefault": System.IndexOutOfRangeException:Index was outside the bounds of the array.
A first chance exception of type 'System.NullReferenceException' occurred in NEAM.App.ProfileDataMart.BL.dll
我将问题追溯到以下方法:
[Event(1, Message = "{2}", Level = EventLevel.Informational, Keywords = Keywords.Informational)]
private void WriteLogDefault(int p_EventId, string p_AssemblyName, int p_Key, string p_Message)
{
WriteEvent(p_EventId, p_AssemblyName, p_Key, p_Message);
}
根据MSDN上的文档中的备注,对WriteEvent的调用应包括EventId,后跟传递给您的方法的所有参数。显然,上面的代码没有在.NET Framework 4.5.2或更早版本中引发任何异常。
实现在EventSource派生类中标识为ETW事件的方法时。您必须调用基类WriteEvent方法,传递EventId和与实现的方法相同的参数。
我的代码现在看起来像这样,并按预期工作。祝你好运!
[Event(1, Message = "{2}", Level = EventLevel.Informational, Keywords = Keywords.Informational)]
public void WriteLogDefault(string p_AssemblyName, int p_Key, string p_Message)
{
WriteEvent(1, p_AssemblyName, p_Key, p_Message);
}