У меня есть веб-приложение. И я хочу регистрировать ответ служб с помощью регистратора.
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 или другим способом?
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 да, посмотрите пример использования
вы можете прикрепить идентификаторы корреляции к logevents - найдите logcontext, интеграция, которая сообщает время запроса в соответствии с вышеизложенным, не предоставляет способа присоединения вещей (и IME тоже не должен - не связывайте регистрацию состояния/времени с записью контента)