Как настроить вывод исключений, используя 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.