EventFlow - 创建自定义筛选器以附加源服务器信息

时间:2017-04-17 16:15:29

标签: elasticsearch etw event-flow

我认为这是一个非常常见的问题,我们如何轻松地将服务器信息添加到EventFlow事件中?

我的方案是我正在部署一个具有自己特定于环境的EventFlowConfig.json的应用程序,但是服务器场中的每个服务器都将获得相同的json文件。那么......如何判断服务器场中的哪个服务器将事件发送给ElasticSearch?

一种选择是使用.net获取servername并将其作为列发送,这需要我为每个事件添加服务器名称。这似乎有点过分,但它会完成这项工作。我希望有一个更简单的方法,除了必须实际编码到一个事件。

谢谢你的时间, 格雷格

编辑4 - Karol一直很好帮助我让这个工作实例启动并运行,谢谢KAROL!尝试添加创建自定义过滤器作为扩展程序:

  1. 我们需要为自定义过滤器工厂
  2. 创建一个新类
  3. 然后我们需要创建第二个新类并让它实现IFilter接口。为了从工厂传递健康监视器,我们使用了构造函数。
  4. 使用Evaluate函数作为我们的区域来添加数据(eventData.AddPayloadProperty)
  5. 然后参考EventFlowConfig.json的扩展区域中的自定义过滤器 一个。该类别是filterFactory

    湾类型是您的类的名称。

    ℃。限定类型名称位于“type-name,assembly-name”中。例如(假设您将过滤器工厂命名为“MyCustomFilterFactory”):“My.Application.Logging.MyCustomFilterFactory,My.Application.Assembly.WhereCustomFilterAndItsFactoreLive”

  6. 添加对C#代码所在的Microsoft.Extensions.Configuration的引用。

  7. 然后您可以在任何需要的地方引用自定义过滤器,这里我们使用全局过滤器

  8. 工作示例:

       class CustomGlobalFilter : IFilter
    {
        private IHealthReporter HealthReporter;
        private string MachineName;
        public CustomGlobalFilter(string ServerName, IHealthReporter HealthReporter)
        {
            MachineName = ServerName;
            this.HealthReporter = HealthReporter;            
        }
    FilterResult IFilter.Evaluate(EventData eventData)
        {            
            eventData.AddPayloadProperty("ServerName", MachineName, HealthReporter, "CustomGlobalFilter");
            return FilterResult.KeepEvent;
        }
    }
    
    class CustomGlobalFilterFactory : IPipelineItemFactory<CustomGlobalFilter>
    {
        public CustomGlobalFilter CreateItem(IConfiguration configuration, IHealthReporter healthReporter)
        {            
            CustomGlobalFilter GlobalFilter = new CustomGlobalFilter(System.Environment.MachineName, healthReporter);            
            return GlobalFilter;
        }
    }
    

    然后在EventFlow配置中:

    "filters": [
    {
      "type": "drop",
      "include": "Level == Verbose"
    },
    {
       "type":  "CustomGlobalFilter"
    }
    ],
    ...
    "extensions": [
    {
      "category": "filterFactory",
      "type": "CustomGlobalFilter",
      "qualifiedTypeName": "My.Company.Presentation.App.CustomGlobalFilter, My.Company.Presentation.App"
    }
    

1 个答案:

答案 0 :(得分:2)

今天不是内置在EventFlow中的东西,但至少有几个选项:

  1. Use EventFlow extensibility添加自定义过滤器,将这些属性添加到它“看到”的每个事件中。
  2. 在许多日志记录库中,存在“初始化器”或“富集”的概念,可用于自动添加上下文属性。例如in Serilog(EventFlow原生支持)