如何为语义记录应用程序块组织EventSources?

语义记录应用程序块(SLAB)对我非常有吸引力,我希望将它用在我正在编写的一个大型复合应用程序中。 为了使用它,我们写了一个派生自'EventSource'的类,并且在类中包含一个方法,用于将每个要作为类型事件记录的事件与一个简单的字符串进行比较。

像我这样的应用程序可能会有数百个这样的事件。 我能有一个“EventSource的”基础类只是一个事件,“SomethingHappened”,并通过记录的一切,在努力和准确性频谱的一个极端结束,我可能对我进行的每一个操作事件。

我觉得为不同的功能领域提供EventSource衍生物是一个好主意。 该应用程序几乎不知道业务逻辑本身; 所有这些都是由MEF插件模块提供的,所以我可以为事件源进行引导,安全性,配置更改等,并且任何插件模块都可以为要记录的任何事件定义事件源。

这是一个好策略,还是许多EventSource派生的记录器是一个不受欢迎的应用程序功能?


从你的问题

...我希望在我正在写的一个大型复合应用程序中使用它...

我可以推断,大的意味着在一个开发人员的背景下。 在这种情况下,您可以从EventSource派生并将您可能想要的所有事件添加到该类中。 为复合应用程序的每个部分创建一个额外的EventSource派生类没什么意义,因为它会污染已经注册2K个提供程序的事件源注册数据库。 除此之外,如果您需要记住20个guid,则需要启用该功能才能通过多个层跟随您的应用程序逻辑,否则将难以为您的应用程序启用日志记录。

妥协方法是在你的EventSource类中定义一些类似的事件

public void WriteViolation(string Subsystem, string Message, string Context)

您的组件中有每个组件的记录器类

public static class NetworkLogger
{
   public static void Violation(string message)
   {
      GenericSource.Instance.Violation("Network", message, NetworkContext.Current);
   }
}

public static class DatabaseLogger
{
  public static void Violation(string message)
  {
      GenericSource.Instance.Violation("Database", message, DBContext.Current);
  }
}

这样,您可以保持记录器组件的特定,并且可以在必要时添加例如自动上下文信息到通用事件。 另一种方法是在你的应用程序中使用跟踪方法进入/离开,信息,警告,错误以及你的EventSource派生类只知道这些事件。 当为每个跟踪条目添加类型名称+方法名称时,您可以按名称空间进行过滤,并按WPA中的类进行分组,以查看您正在执行的操作。 Semantic Tracing for .NET 4.0中给出了一个例子。 对于大型应用程序,您可以在计算机上检出文件

C:WindowsMicrosoft.NETFrameworkv4.0.30319CLR-ETW.man

您可以使用Windows SDK中的ecmangen.exe打开它,以获得一个很好的GUI,以查看事件的结构。 .NET只定义了两个事件提供者。 许多事件通过关键字进行分组,以启用.NET的特定方面,例如GC,Loader,Exceptions,....这很重要,因为您可以通过提供商特定的关键字来启用某个大型提供商的某些事件。

您还可以查看Microsoft.Windows.ApplicationServer.Applications.45.man以了解Workflow员工如何思考ETW事件。 这应该有助于找到你自己的方式。 由于真正的测试是在客户网站发现生产错误,因此关于如何组织自己的活动并不多。 这个概率很高,您需要进行多次迭代,直到找到合适的平衡来记录/跟踪相关信息,以帮助您诊断现场故障。


对于评论而言,这太冗长了。 但是,如何模板,然后工厂服务?

然后这不会改变,并且在应用程序启动时和加载插件后,将所有内容都绑定在一起。

interface IReportable
{
    void Report(object param);
}

interface IKernel
{
    T Get<T>();
}

class EventSource2 : EventSource
{
    private IKernel _factory;

    public EventSource2(IKernel factory)
    {
        _factory = factory;
    }

    public void Report<TReportable>(object param = null) where TReportable : IReportable
    {
        var reportable = _factory.Get<TReportable>();

        reportable.Report(param);

        //... Do what you want to do with EventSource
    }
}

将事件逻辑分组到不同的较小提供者(EventSource类)中,而不是放入一个大文件中。

这具有的优点是,您可以仅在特殊情况下为您关心的提供商启用事件。

链接地址: http://www.djcxy.com/p/90863.html

上一篇: How can I organize EventSources for the Semantic Logging Application Block?

下一篇: ETW EventSource Name at runtime