Serilog не регистрируется на сервере ElasticSearch и выдает исключение

#asp.net-core #elasticsearch #kibana #serilog

Вопрос:

Я пытаюсь начать вход в ElasticSearch, но на сервере не найдено журналов, и если я включу режим диагностики, возникнет исключение:

Вот как выглядит мой Startup.cs:

             //ElasticSearch Logs
        Log.Logger = new LoggerConfiguration()
         .Enrich.FromLogContext()
         .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("https://myserver.com:9243/"))
         {
             ModifyConnectionSettings = x => x.BasicAuthentication("elastic", "mypassword"),
             AutoRegisterTemplate = true,                 
         })
         .Enrich.FromLogContext()
         .WriteTo.Console()
        .CreateLogger();
 

Ниже приведена моя программа.cs

         public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>()
                .UseSerilog();
            });
 

Это то, что у меня есть внутри контроллера:

         _logger.LogError(new Exception("test"), "An error has occurred.");
        _logger.LogInformation("The {User} has just executed {Action}.", "username", "actionName");

        Log.Error("this is my first log");
 

Исключение, которое я получаю:

2021-08-19T21:09:15.2793348 Z Не удалось создать шаблон. Исключение Elasticsearch.Net.ElasticsearchClientException: Запрос не удалось выполнить. Вызов: Код статуса 400 из: PUT /_template/serilog-события-шаблон. Ошибка сервера: Тип: исключение mapper_parsing_exception Причина: «Не удалось проанализировать сопоставление [_doc]: Определение корневого сопоставления содержит неподдерживаемые параметры: [по умолчанию : {dynamic_templates=[{numerics_in_fields={match_pattern=регулярное выражение, path_match=поля.[d ]$, сопоставление={нормы=ложь, индекс=истина, тип=текст}}}, {строковые поля={сопоставление={нормы=ложь, индекс=истина, тип=текст, поля={необработанные={ignore_above=256, индекс=истина, тип=ключевое слово}}}, match_mapping_type=строка, соответствие=}}], свойства={сообщение={индекс=истина, тип=текст}, исключения={тип=вложенный, свойства={Исключениеmessage={тип=объект, свойства={Тип члена={тип=целое число}}}, StackTraceString={индекс=истина, тип=текст}, HResult={тип=целое число}, RemoteStackTraceString={индекс=истина, тип=текст}, RemoteStackIndex={тип=целое число}, Глубина={тип=целое число}}}}}]» Причина: «Тип: исключение mapper_parsing_exception Причина: «Определение корневого сопоставления содержит неподдерживаемые параметры: [по умолчанию : {dynamic_templates=[{numerics_in_fields={match_pattern=регулярное выражение, path_match=поля.[выражениеD ]$, отображение={нормами,=ложь,=индекс есть, тип=текст}}}, {string_fields={картографическая={нормами,=ложь,=индекс есть, тип=текст, поля={сырьем={ignore_above=256, индекс=есть, тип=ключевое слово}}}, match_mapping_type=строке, матч=}}], свойства={сообщение={индекс=есть, тип=текст}, исключения={тип=вложенными, свойства={Сообщение_об_исключении={тип=объект, свойства={свойством membertype={тип=целое число}}}, StackTraceString={индекс=есть, тип=текст}, значение HRESULT={тип=целое число}, RemoteStackTraceString={индекс=есть, тип=текст}, RemoteStackIndex={тип=целое число}, глубина={тип=целое число}}}}}]»» на решение Elasticsearch.Сеть.Транспорт 1.HandleElasticsearchClientException(RequestData data, Exception clientException, IElasticsearchResponse response) at Elasticsearch.Net.Transport 1.Завершение ответа[TResponse](данные запроса, данные запроса, трубопровод IRequestPipeline, Список 1 seenExceptions, TResponse response) at Elasticsearch.Net.Transport 1.Запрос[TResponse](метод HttpMethod, путь к строке, данные postData, параметры запроса IRequestParameters) в Elasticsearch.Net.ElasticLowLevelClient.doRequest[TResponse](метод HttpMethod, путь к строке, данные postData, параметры запроса IRequestParameters) в Elasticsearch.Net.NamespacedClientProxy.doRequest[TResponse](сообщение HttpMethod, URL-адрес строки, тело данных postData, параметры параметров IRequestParameters) в Elasticsearch.Net.Спецификация.Индексапи.Пространство имен нижнего уровня.PutTemplateForAll[TResponse](имя строки, тело postData, параметры запроса PutIndexTemplateRequestParameters) в Serilog.Умывальники.Эластичный поиск.ElasticsearchSinkState.зарегистрироватьтемплатеобходимо()

Есть какие-нибудь подсказки, чего мне может не хватать, или какие-либо советы о том, как узнать, где ошибка?

Ответ №1:

Похоже, приемник не смог зарегистрировать шаблон с помощью Elasticsearch. Возможно, это связано с тем, что вы используете более свежую версию Elasticsearch и не указываете, какую версию вы используете, поэтому приемник предполагает, что вы используете более старую версию до 5.0:

При использовании AutoRegisterTemplate функции это позволяет установить версию Elasticsearch. В зависимости от версии будет выбран шаблон. По умолчанию установлено значение до версии 5.0.

Вы должны AutoRegisterTemplateVersion.ESv7 или AutoRegisterTemplateVersion.ESv6 в зависимости от того, какую версию вы используете

напр.

 Log.Logger = new LoggerConfiguration()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200") )
    {
        AutoRegisterTemplate = true,
        AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7, // <<<<<#####
    })
    .CreateLogger();