我正在使用语义记录应用程序块,我有以下两个基于EventSource的类(为简洁省略了内部常量类:
[EventSource(Name = EventSourceNames.Prism)]
public sealed class PrismEventSource: EventSource
{
public static PrismEventSource Log = new PrismEventSource();
[Event(1, Keywords = EventKeywords.None, Level = EventLevel.Informational)]
public void PrismEvent(string message, Category category, Priority priority)
{
if (IsEnabled())
{
WriteEvent(1, message, category);
}
}
}
和
[EventSource(Name = EventSourceNames.Application)]
public sealed class ApplicationEventSource : EventSource
{
public static ApplicationEventSource Log = new ApplicationEventSource();
[Event(2, Message = "Duplicate menu item: {0}", Keywords = Keywords.Menu, Level = EventLevel.LogAlways, Task = Tasks.ImportMenu)]
public void DuplicateMenuItem(string menuItemPath)
{
if (IsEnabled())
{
WriteEvent(2, menuItemPath);
}
}
}
我有两个项目范围的单一监听器:
RollingLog = RollingFlatFileLog.CreateListener("XTimeDev.log", 2048, "yyyyMMdd HHmmss", RollFileExistsBehavior.Overwrite, RollInterval.None);
RollingLog.EnableEvents(EventSourceNames.Prism, EventLevel.LogAlways);
RollingLog.EnableEvents(EventSourceNames.Application, EventLevel.LogAlways);
然而,当我尝试从我的应用程序源登录时,日志文件中没有任何内容:
try
{
Current.RegisterMenuItem(xtimeItem);
}
catch (ArgumentException ax)
{
ApplicationEventSource.Log.DuplicateMenuItem(ax.Message);
}
我在日志文件中看到的是Prism通过其事件源记录的启动事件,我在MefBootstrapper.CreateLogger
中给出的事件:
class BootLogger : ILoggerFacade
{
public void Log(string message, Category category, Priority priority)
{
PrismEventSource.Log.PrismEvent(message, category, priority);
}
}
为什么只有PrismEventSource
而不是ApplicationEventSource
写入文件?
答案 0 :(得分:3)
您的方法签名与您传递给WriteEvent
的参数数量不匹配。
如果你把它改成它应该有效:
public void PrismEvent(string message, Category category, Priority priority)
{
if (IsEnabled())
{
WriteEvent(1, message, category, priority);
// ^ ^
}
}
匹配签名是正常工作所必需的。
您可以使用EventSourceAnalyzer
在单元测试中检测此类未来问题。我建议使用它,因为它会更快地发现这些错误。