Как настроить вывод исключений, используя serilog

Я использую Serilog в качестве основы для логирования (с Seq в качестве приемника). При регистрации исключений я использую что-то вроде:

log.Error(ex, "Operation Failed");

Мое приложение интенсивно использует асинхронные / ожидающие методы. При возникновении необработанных исключений трассировки стека очень трудно читать. Существует пакет nuget, который очищает трассировки асинхронного стека ( https://github.com/aelij/AsyncFriendlyStackTrace). Это создает метод расширения, который дает вам доступ к измененной / чистой трассировке стека:

ex.ToAsyncString()

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

Есть ли способ с Serilog/Seq для контроля точного вывода строки ошибки, которая отправляется в приемник журнала?

1 ответ

Решение

Возможно, обогащение может быть полезным здесь. Хотя это конкретно не обсуждается в этой ссылке, вы можете создать собственные обогащения:

public class ExceptionEnricher : ILogEventEnricher
{
    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
        if (logEvent.Exception != null)
        {
            // do something here

            propertyFactory.CreateProperty("ExtraExceptionDetail", extraDetail);
        }
    }
}

затем...

var loggerConfig = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Seq(url)
    .Enrich.With<ExceptionEnricher>()
    .Enrich.FromLogContext();

У меня нет опыта работы с пакетом, на который вы ссылались, но этот подход позволяет вам перехватывать и изменять / добавлять / удалять свойства события перед его записью в Seq.

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