2

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

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

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

谢谢你的时间,格雷格

编辑 4 - Karol 非常棒地帮助我启动并运行了这个工作示例,谢谢 KAROL !!!尝试添加创建自定义过滤器作为扩展:

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

    湾。类型是您的类的名称。

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

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

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

工作示例:

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

1 回答 1

2

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

  1. 使用 EventFlow 可扩展性添加一个自定义过滤器,将这些属性添加到它“看到”的每个事件中。
  2. 在许多日志库中,有一个“初始化程序”或“丰富”的概念,可用于自动添加上下文属性。例如在 Serilog 中(EventFlow 原生支持)
于 2017-04-17T16:48:13.523 回答