EventFlow - Создание пользовательского фильтра для прикрепления информации исходного сервера
Я предполагаю, что это довольно распространенный вопрос, как мы можем легко добавить информацию о сервере в событие EventFlow?
Мой сценарий заключается в том, что я развертываю приложение, которое будет иметь свою собственную среду EventFlowConfig.json, но каждый сервер в ферме получит один и тот же файл json. Итак... как мне узнать, какой сервер в ферме отправил событие в ElasticSearch?
Одним из вариантов является использование.net для получения имени сервера и отправки его в виде столбца, что потребует добавления имени сервера к каждому событию. Это кажется немного чрезмерным, но это сделало бы работу. Я надеялся, что есть более простой способ, кроме того, чтобы фактически кодировать это в событие.
Спасибо за ваше время, Грег
Редактировать 4 - Кароль здорово помог мне получить этот рабочий пример и поблагодарить его, СПАСИБО, КАРОЛЬ!!! Попытка добавить создание пользовательского фильтра в качестве расширения:
- Нам нужно создать новый класс для пользовательской фабрики фильтров.
- Затем нам нужно создать второй новый класс и заставить его реализовать интерфейс IFilter. Чтобы передать монитор здоровья с завода, мы использовали конструктор.
- Используйте функцию Evaluate в качестве нашей области для добавления данных (eventData.AddPayloadProperty)
Затем обратитесь к пользовательскому фильтру в области расширений нашего EventFlowConfig.json.
а. Категория filter Factoryб. Тип - это имя вашего класса.
с. Полное имя типа находится в "type-name, assembly-name". Например (при условии, что вы называете свою фабрику фильтров MyCustomFilter Factory): "My.Application.Logging.MyCustomFilterFactory, My.Application.Assembly.WhereCustomFilterAndItsFactoreLive"
Добавьте ссылку на Microsoft.Extensions.Configuration, где находится код C#.
Затем вы можете ссылаться на свой пользовательский фильтр везде, где вам нужно, здесь мы используем глобальный фильтр
Рабочий пример:
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 ответ
Это не то, что встроено в EventFlow сегодня, но есть по крайней мере несколько вариантов:
- Используйте расширяемость EventFlow, чтобы добавить пользовательский фильтр, который добавляет эти свойства к каждому событию, которое он "видит".
- Во многих библиотеках журналов есть понятие "инициализаторы" или "обогащения", которые можно использовать для автоматического добавления контекстных свойств. Например, в Serilog (который изначально поддерживается EventFlow)