Как добавить прошедшее время в журнал с помощью dotnet serilog?

У меня есть веб-приложение. И я хочу регистрировать ответ служб с помощью регистратора.

public class PrivacyModel : PageModel
{
    private readonly ILogger<PrivacyModel> _logger;
    private readonly MyService _service;

    public PrivacyModel(ILogger<PrivacyModel> logger, MyService service)
    {
        _logger = logger;
        _service = service;
    }

    public void OnGet(string question)
    {
        var answer = service.Execute(question);
        _logger.LogInformation("{@a}", answer);
    }
}

Серилог записывает эту информацию. И записывает журналы прошедшего времени выполнения API в виде новых строк журнала.

[12:01:43 INF] Starting web application
[12:01:44 INF] Now listening on: http://localhost:5000
[12:01:44 INF] Application started. Press Ctrl+C to shut down.
[12:01:44 INF] Hosting environment: Development
[12:01:44 INF] Content root path: serilog-aspnetcore/samples/Sample
[12:01:47 WRN] Failed to determine the https port for redirect.
[12:01:47 INF] { "answer": "hello" }
[12:01:47 INF] HTTP GET / responded 200 in 95.0581 ms

Добавляю логи в elasticsearch и grafana. Поэтому мне нужно объединить прошедшее время выполнения действия, прошедшее время и ответ на ответ в одном и том же json.

Могу ли я присоединиться, используя Serilog rich или другим способом?

вы можете прикрепить идентификаторы корреляции к logevents - найдите logcontext, интеграция, которая сообщает время запроса в соответствии с вышеизложенным, не предоставляет способа присоединения вещей (и IME тоже не должен - не связывайте регистрацию состояния/времени с записью контента)

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

Ответы 1

Ответ принят как подходящий
using Serilog.Core;
using Serilog.Events;
using System;

// Custom enricher:

public class ElapsedTimeEnricher : ILogEventEnricher
{
    private readonly string _propertyName;
    private readonly DateTime _startTime;

    public ElapsedTimeEnricher(string propertyName = "ElapsedTime")
    {
        _propertyName = propertyName;
        _startTime = DateTime.UtcNow;
    }

    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
        var elapsed = DateTime.UtcNow - _startTime;
        var elapsedSeconds = elapsed.TotalSeconds;

        var elapsedProperty = new LogEventProperty(_propertyName, new ScalarValue(elapsedSeconds));
        logEvent.AddPropertyIfAbsent(elapsedProperty);
    }
}

Пример использования

try
{
    // Configure Serilog to use the custom enricher:
    Log.Logger = new LoggerConfiguration()
        .Enrich.With(new ElapsedTimeEnricher())
        .WriteTo.Console()
        .CreateLogger();

    Log.Information("Starting web application");
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddSerilog(); // <-- Add this line     
    var app = builder.Build();
    app.MapGet("/", () => "Hello World!");

    app.Run();
}
catch (Exception ex)
{
    Log.Fatal(ex, "Application startup failed");
}
finally
{
    Log.CloseAndFlush();
}

Является ли время начала выполнения действия временем начала?

barteloma 14.07.2024 13:33

@barteloma да, посмотрите пример использования

Ihdina 15.07.2024 03:43

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