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





Elasticsearch — это «просто» браузер журналов. Чтобы просмотреть свои журналы, вам нужно будет сгенерировать эти журналы.
Настройте приложение для работы, например, с Serilog (https://stackify.com/serilog-tutorial-net-logging/). Он будет генерировать файлы журнала.
Затем настройте приемник на Elasticsearch (https://github.com/serilog/serilog-sinks-elasticsearch). Он будет записывать ваши журналы там, где эластичный поиск может их прочитать.
Первая ссылка — это глобальное руководство по использованию Serilog в приложении .NET. Информация актуальна для .NET Framework, Standard и Core. В статье также содержится ссылка на проект Serilog.AspNetCore (github.com/serilog/serilog-aspnetcore). Что касается вашего исключения, трудно сказать вам, что не так с вашим кодом, не читая его. Однако документация репозитория serilog-sinks-elasticsearch настолько верна, насколько это возможно. Продолжайте пробовать эту раковину, и у вас все получится.
Рад видеть, что вы разобрались! Не могли бы вы пометить мой ответ как действительный ответ, если вам удалось найти недостающую информацию благодаря ему? :)
Спасибо Skrface за вашу поддержку. Я подытожу свой код для тех, кто проходит мимо по той же проблеме. (Информацию о CLI и папках решений см. ниже.)
Реализация в .NET Core Web API
добавить пакеты NuGet:
добавить в 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:
добавить в 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
Хотя это почти идеально подходит для легкого ведения журналов в эластичном, оно не поддерживает аутентификацию, что делает его бесполезным для экземпляров эластичного облака.
Да, первоначальная версия не включала аутентификацию. Код интегрируется в проект Elastic.NET, включая добавление аутентификации (для эластичного облака и т. д.). Обновленная версия еще не выпущена через Nuget, но код слит: github.com/elastic/ecs-dotnet/tree/master/src/…
Благодарю. Я обнаружил, что если я включу имя пользователя/пароль в uri, то это сработает, но было бы лучше настроить их в параметрах. спасибо за библиотеку, авторизоваться в эластике стало проще простого.
Очень рад видеть поставщика журналов ElasticSearch, который не требует Serilog! Есть идеи, когда Elasticsearch.Extensions.Logging будет выпущен в Nuget?
Ожидание нового пакета Elasticsearch.Extensions.Logging!
Первая ссылка на самом деле не используется для .NET Core Web Api, а также для входа в файл. Вторая ссылка предоставляет информацию. Но используя этот код, я получаю исключение. var logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger(); --> System.InvalidCastException: 'Неверное приведение от 'System.String' к 'System.IFormatProvider'.'