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

EventFlow - Creating a Custom Filter to attach Source Server Information

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

我的情况是,我正在部署一个应用程序,该应用程序将具有自己的特定环境 EventFlowConfig.json,但场中的每台服务器都将获得相同的 json 文件。那么...我如何知道场中的哪个服务器将事件发送到 ElasticSearch?

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

感谢您的宝贵时间, 格雷格

编辑 4 - Karol 帮我搞定了这个工作示例,运行,谢谢 KAROL!正在尝试添加创建自定义过滤器作为扩展:

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

    b。类型是您的 class 的名称。

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

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

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

工作示例:

   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"
}

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

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