我假设这是一个很常见的问题,我们如何轻松地将服务器信息添加到 EventFlow 事件中?
我的场景是我正在部署一个应用程序,该应用程序将具有自己的特定于环境的 EventFlowConfig.json,但场中的每个服务器都将获得相同的 json 文件。那么......我如何判断场中的哪个服务器将事件发送到 ElasticSearch?
一种选择是使用 .net 获取服务器名称并将其作为列发送,这需要我将服务器名称添加到每个事件中。这似乎有点过分,但它会做的工作。除了必须将其实际编码到事件中之外,我希望有一种更简单的方法。
谢谢你的时间,格雷格
编辑 4 - Karol 非常棒地帮助我启动并运行了这个工作示例,谢谢 KAROL !!!尝试添加创建自定义过滤器作为扩展:
- 我们需要为自定义过滤器工厂创建一个新类
- 然后我们需要创建第二个新类并让它实现 IFilter 接口。为了从工厂传递健康监视器,我们使用了构造函数。
- 使用 Evaluate 函数作为我们添加数据的区域(eventData.AddPayloadProperty)
然后参考我们的 EventFlowConfig.json 的扩展区域中的自定义过滤器。
一种。类别为 filterFactory湾。类型是您的类的名称。
C。限定的类型名称在“type-name, assembly-name”中。例如(假设您将过滤器工厂命名为“MyCustomFilterFactory”):“My.Application.Logging.MyCustomFilterFactory, My.Application.Assembly.WhereCustomFilterAndItsFactoreLive”</ p>
添加对 C# 代码所在的 Microsoft.Extensions.Configuration 的引用。
然后你可以在任何你需要的地方引用你的自定义过滤器,这里我们使用一个全局过滤器
工作示例:
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"
}