Как войти из .NET Core Web API в Elasticsearch по собственному индексу

У меня есть веб-API .NET, написанный с С# и Эластичный поиск. В Elasticsearch у меня есть индекс «Ведение журнала», куда я хочу отправить свои журналы из API.

Я не могу понять, как получить свои журналы из C# API в Elastic «ведение журнала». Я читал такие документы, как Ведение журнала с помощью ElasticSearch..., но у меня нет logstash в моем Elasticsearch. Итак, я ищу пакет, который упрощает вход в систему. Я думаю, нужно сдать индексные «логирующие», чтобы он знал, куда логиниться.

Кто-нибудь может порекомендовать документацию и/или пакет для этого?

Или мне нужно программировать его самостоятельно?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
17 877
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Elasticsearch — это «просто» браузер журналов. Чтобы просмотреть свои журналы, вам нужно будет сгенерировать эти журналы.

Настройте приложение для работы, например, с Serilog (https://stackify.com/serilog-tutorial-net-logging/). Он будет генерировать файлы журнала.

Затем настройте приемник на Elasticsearch (https://github.com/serilog/serilog-sinks-elasticsearch). Он будет записывать ваши журналы там, где эластичный поиск может их прочитать.

Первая ссылка на самом деле не используется для .NET Core Web Api, а также для входа в файл. Вторая ссылка предоставляет информацию. Но используя этот код, я получаю исключение. var logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).‌​CreateLogger(); --> System.InvalidCastException: 'Неверное приведение от 'System.String' к 'System.IFormatProvider'.'

Frank Mehlhop 10.04.2019 11:26

Первая ссылка — это глобальное руководство по использованию Serilog в приложении .NET. Информация актуальна для .NET Framework, Standard и Core. В статье также содержится ссылка на проект Serilog.AspNetCore (github.com/serilog/serilog-aspnetcore). Что касается вашего исключения, трудно сказать вам, что не так с вашим кодом, не читая его. Однако документация репозитория serilog-sinks-elasticsearch настолько верна, насколько это возможно. Продолжайте пробовать эту раковину, и у вас все получится.

Skrface 10.04.2019 11:49

Рад видеть, что вы разобрались! Не могли бы вы пометить мой ответ как действительный ответ, если вам удалось найти недостающую информацию благодаря ему? :)

Skrface 10.04.2019 16:15

Спасибо Skrface за вашу поддержку. Я подытожу свой код для тех, кто проходит мимо по той же проблеме. (Информацию о CLI и папках решений см. ниже.)

Реализация в .NET Core Web API

добавить пакеты NuGet:

  • Серилог
  • Serilog.AspNetCore
  • Serilog.Sinks.Elasticsearch

добавить в appsettings.json:

"Serilog": {
"MinimumLevel": "Information",
"WriteTo": [
  {
    "Name": "RollingFile",
    "Args": {
      "pathFormat": "C:\\Temp\\log-{Date}.txt",
      "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
    }
  }
],
"Properties": {
  "Application": "DataPicker.Api"
}

}

изменить Startup.cs

    public IConfiguration Configuration { get; }
    public Startup(IHostingEnvironment hostingEnvironment)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(hostingEnvironment.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", reloadOnChange: true, optional: true)
            .AddEnvironmentVariables();
        Configuration = builder.Build();
        var uri = Configuration["ConnectionStrings:ElasticSearchConnection"];
        Log.Logger = new LoggerConfiguration()
            .Enrich.FromLogContext()
            .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(uri))
            {
                AutoRegisterTemplate = true,
            })
        .CreateLogger();
    }

добавить в Startup.cs Configure(..)

loggerFactory.AddSerilog();

изменить контроллер:

public class MyController : Controller
{
    private readonly ILogger<MyController > logger;

    public MyController (ILogger<MyController> logger)
    {
        this.logger = logger;
    }

и используйте логирование в POST/PUT/GET/... -методе так:

logger.LogDebug("My message");
logger.LogError("Exception: " + ex.Message);

Реализация в .NET Core CLI

добавить пакет NuGet:

  • Serilog.Sinks.Elasticsearch

добавить в Programm.cs в Main(..)

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
    .Enrich.FromLogContext()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("myUri:myPort")) // e.g. "http://localhost:9200"
    {
        AutoRegisterTemplate = true,
    })
    .CreateLogger();

чем использовать его так:

Log.Debug("Start CLI !");
Log.Error("Can't create data base entry: " + ex.Message);

Реализация в папке решения .NET Core

Работает так же, как в CLI (см. выше), просто используйте свой конструктор вместо Main(..).

Лично я использую Filebeat для сбора журналов из разных источников, добавления настраиваемого поля для каждого из них (например, app: "myappp1") и вывода его в Elasticsearch. Затем я создаю запросы в Kibana на основе этих полей. Пример:

filebeat.inputs:

- type: log
  enabled: true
  paths:
    - C:\ProgramData\Elastic\Elasticsearch\logs\*
  fields:
    app: "elasticsearch"

- type: log
  enabled: true
  paths:
    - C:\temp\log\myapp1\*
  fields:
app: "myapp1"

Хотя, если вы действительно хотите иметь несколько индексов, я рекомендую использовать Логсташ, который может создать индекс, используя шаблоны или имя поля. У Этот вопрос есть хорошие ответы об использовании logstash для создания нескольких индексов.

Теперь также существует отдельный поставщик средств ведения журнала, который будет записывать журналы .NET Core непосредственно в Elasticsearch в соответствии со спецификациями поля Elasticsearch Common Schema (ECS), https://github.com/sgryphon/essential-logging/tree/master/src/Essential.LoggerProvider.Elasticsearch.

Отказ от ответственности: я автор.

Добавьте ссылку на пакет Essential.LoggerProvider.Elasticsearch:

dotnet add package Essential.LoggerProvider.Elasticsearch

Затем добавьте поставщика в loggingBuilder во время создания хоста, используя предоставленный метод расширения.

using Essential.LoggerProvider;

// ...

    .ConfigureLogging((hostContext, loggingBuilder) =>
    {
        loggingBuilder.AddElasticsearch();
    })

Затем вы можете внедрить ILogger в свои контроллеры и т. д. и записать в него, используя обычную регистрацию .NET, включая области действия и семантические значения (для общего введения в регистрацию см. https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/):

using (_logger.BeginScope("{CustomerId}", customerId))
{
  _logger.LogWarning("End of processing reached at {EndTime}.", end);
}

Конфигурация по умолчанию будет выполнять запись в локальный Elasticsearch, работающий по адресу http://локальный:9200/.

Существует пример проекта, который включает в себя файл docker-compose для настройки локального экземпляра Elasticsearch и Kibana, если вам нужно, https://github.com/sgryphon/essential-logging/tree/master/examples/HelloElasticsearch

В примере проекта также показаны рекомендации по высокопроизводительному ведению журналов с помощью помощника Microsoft LoggerMessage.

После отправки некоторых событий журнала откройте Kibana (например, http://локальный:5601/) и определите шаблон индекса для "dotnet-*" с временным фильтром "@timestamp" (это шаблон индекса по умолчанию для поставщика регистратора).

Примечание. Чтобы использовать ведение журнала индекса-*, согласно вопросу, вам также необходимо изменить параметр конфигурации и добавить следующее в файл appsettings.json:

{
  "Logging": {
    "Elasticsearch": {
      "Index": "logging-{0:yyyy.MM.dd}"
    }
  }
}

Затем вы можете обнаружить события журнала для индекса. Некоторые полезные столбцы для добавления: log.level, log.logger, event.code, message, tags и process.thread.id.

Если вы используете несколько приложений или на нескольких серверах, вы можете включить service.type, service.version и host.hostname.

Дополнительные поля определены ниже, а все отдельные сообщения и значения областей регистрируются как метки.* Пользовательские пары ключ/значение, например. этикетки.CustomerId.

Одним из преимуществ ElasticsearchLoggerProvider является то, что он следует Общая схема Elasticsearch (ECS) для полей, поэтому он совместим с другими приложениями, которые регистрируются в Elasticsearch (например, Beats).

Пример вывода: Пример — вывод Elasticsearch через Kibana

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

Erdogan Kurtur 14.01.2021 09:59

Да, первоначальная версия не включала аутентификацию. Код интегрируется в проект Elastic.NET, включая добавление аутентификации (для эластичного облака и т. д.). Обновленная версия еще не выпущена через Nuget, но код слит: github.com/elastic/ecs-dotnet/tree/master/src/…

Sly Gryphon 17.01.2021 07:54

Благодарю. Я обнаружил, что если я включу имя пользователя/пароль в uri, то это сработает, но было бы лучше настроить их в параметрах. спасибо за библиотеку, авторизоваться в эластике стало проще простого.

Erdogan Kurtur 18.01.2021 08:17

Очень рад видеть поставщика журналов ElasticSearch, который не требует Serilog! Есть идеи, когда Elasticsearch.Extensions.Logging будет выпущен в Nuget?

Tobias J 18.01.2021 15:57

Ожидание нового пакета Elasticsearch.Extensions.Logging!

Roman 23.01.2021 11:44

Другие вопросы по теме