EventFlow - Создание пользовательского фильтра для прикрепления информации исходного сервера

Я предполагаю, что это довольно распространенный вопрос, как мы можем легко добавить информацию о сервере в событие EventFlow?

Мой сценарий заключается в том, что я развертываю приложение, которое будет иметь свою собственную среду EventFlowConfig.json, но каждый сервер в ферме получит один и тот же файл json. Итак... как мне узнать, какой сервер в ферме отправил событие в ElasticSearch?

Одним из вариантов является использование.net для получения имени сервера и отправки его в виде столбца, что потребует добавления имени сервера к каждому событию. Это кажется немного чрезмерным, но это сделало бы работу. Я надеялся, что есть более простой способ, кроме того, чтобы фактически кодировать это в событие.

Спасибо за ваше время, Грег

Редактировать 4 - Кароль здорово помог мне получить этот рабочий пример и поблагодарить его, СПАСИБО, КАРОЛЬ!!! Попытка добавить создание пользовательского фильтра в качестве расширения:

  1. Нам нужно создать новый класс для пользовательской фабрики фильтров.
  2. Затем нам нужно создать второй новый класс и заставить его реализовать интерфейс IFilter. Чтобы передать монитор здоровья с завода, мы использовали конструктор.
  3. Используйте функцию Evaluate в качестве нашей области для добавления данных (eventData.AddPayloadProperty)
  4. Затем обратитесь к пользовательскому фильтру в области расширений нашего EventFlowConfig.json.
    а. Категория filter Factory

    б. Тип - это имя вашего класса.

    с. Полное имя типа находится в "type-name, assembly-name". Например (при условии, что вы называете свою фабрику фильтров MyCustomFilter Factory): "My.Application.Logging.MyCustomFilterFactory, My.Application.Assembly.WhereCustomFilterAndItsFactoreLive"

  5. Добавьте ссылку на Microsoft.Extensions.Configuration, где находится код C#.

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

1 ответ

Решение

Это не то, что встроено в EventFlow сегодня, но есть по крайней мере несколько вариантов:

  1. Используйте расширяемость EventFlow, чтобы добавить пользовательский фильтр, который добавляет эти свойства к каждому событию, которое он "видит".
  2. Во многих библиотеках журналов есть понятие "инициализаторы" или "обогащения", которые можно использовать для автоматического добавления контекстных свойств. Например, в Serilog (который изначально поддерживается EventFlow)
Другие вопросы по тегам