2016-09-16 7 views
3

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

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

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

ex.ToAsyncString() 

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

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

+0

, когда вы поставили точку останова на 'log.Error (ex, .....)' вы можете получить на 'ex.Message или InnerException' на данный момент ..? – MethodMan

ответ

2

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

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.