2014-08-15 2 views
11

Serilog имеет удобный способ уничтожения того объектов, как показано в следующем примере:Исключение деструктурирующий в Serilog

logger.Debug(exception, "This is an {Exception} text", exception); 
logger.Debug(exception, "This is an {@Exception} structure", exception); 

Первая строка вызывает регистратор для регистрации исключение как обычный текст (по телефону ToString()), и вторая строка заставляет регистратор записывать свойства исключения в виде отдельных полей. Но что об этом перегрузке:

logger.Debug(exception, "This is an exception", exception); 

Это один берет исключения в качестве первого аргумента, и он всегда записываются в виде строки. То, что я хотел бы сделать возможным, заключается в том, чтобы включить исключение регистрации в структурированном виде. Можно ли настроить Serilog для этого?

ОБНОВЛЕНИЕ. Я предполагаю, что этот вопрос приводит к еще одному аспекту исключений регистрации: как я могу обеспечить, чтобы сообщения были обогащены свойствами исключений (поэтому они регистрируются структурированным способом для богатых поглотителей, таких как Elasticsearch), не записывая все свойства исключения в отображаемое текстовое сообщение (поэтому обычные текстовые журналы не заполнены огромными кучами деталей исключения).

ответ

11

Существует forum thread discussing this, в котором представлены несколько решений. Томас Болон создал расширение исключения для деструкции, вы можете найти in a Gist.

В этом случае вы используете только этот синтаксис:

logger.Debug(exception, "This is an exception"); 

Там нет необходимости добавлять исключение в строку формата.

Чтобы исключение печаталось в текстовые раковины, просто убедитесь, что в выходной шаблон включен {Exception}. Стандартный встроенный в них уже есть это, например .:

outputTemplate: "{Timestamp} [{Level}] {Message}{NewLine}{Exception}"; 
+1

Спасибо за ответ. Я посмотрю на реализацию Томаса. –

+1

Обратите внимание, что ответ ниже относится к полной реализации оригинальной идеи в связанном Gist, доступном в github, и как пакет Nuget Serilog.Exceptions. – JotaBe

13

Посмотрите на Serilog.Exceptions бревнами детали исключения и пользовательские свойства, которые не выводятся в Exception.ToString().

Эта библиотека имеет собственный код для работы с дополнительными свойствами в большинстве распространенных типов исключений и только возвращается к использованию отражения, чтобы получить дополнительную информацию, если исключение не поддерживается Serilog. Исключения внутри.

Добавьте пакет NuGet, а затем добавить обогатитель так:

using Serilog; 
using Serilog.Exceptions; 

ILogger logger = new LoggerConfiguration() 
    .Enrich.WithExceptionDetails() 
    .WriteTo.Sink(new RollingFileSink(
     @"C:\logs", 
     new JsonFormatter(renderMessage: true)) 
    .CreateLogger(); 

Ваших журналы JSON теперь будут дополнены с подробной информацией исключения и даже пользовательскими свойствами исключения. Ниже приведен пример того, что происходит, когда вы регистрируете исключение DbEntityValidationException из EntityFramework (это исключение печально известно наличием глубоко вложенных пользовательских свойств, которые не включены в .ToString()).

try 
{ 
    ... 
} 
catch (DbEntityValidationException exception) 
{ 
    logger.Error(exception, "Hello World"); 
} 

Код выше регистрирует следующее:

{ 
    "Timestamp": "2015-12-07T12:26:24.0557671+00:00", 
    "Level": "Error", 
    "MessageTemplate": "Hello World", 
    "RenderedMessage": "Hello World", 
    "Exception": "System.Data.Entity.Validation.DbEntityValidationException: Message", 
    "Properties": { 
    "ExceptionDetail": { 
     "EntityValidationErrors": [ 
     { 
      "Entry": null, 
      "ValidationErrors": [ 
      { 
       "PropertyName": "PropertyName", 
       "ErrorMessage": "PropertyName is Required.", 
       "Type": "System.Data.Entity.Validation.DbValidationError" 
      } 
      ], 
      "IsValid": false, 
      "Type": "System.Data.Entity.Validation.DbEntityValidationResult" 
     } 
     ], 
     "Message": "Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.", 
     "Data": {}, 
     "InnerException": null, 
     "TargetSite": null, 
     "StackTrace": null, 
     "HelpLink": null, 
     "Source": null, 
     "HResult": -2146232032, 
     "Type": "System.Data.Entity.Validation.DbEntityValidationException" 
    }, 
    "Source": "418169ff-e65f-456e-8b0d-42a0973c3577" 
    } 
} 

Serilog.Exceptions поддерживает .NET Standard и поддерживает множество общих типов исключений без отражения, но мы хотели бы, чтобы добавить больше, поэтому, пожалуйста, не стесняйтесь вносить свой вклад ,

Top Tip - Человек читаемым Stack Следы

Вы можете использовать NuGet пакет Ben.Demystifier, чтобы получить читаемый следы стека человека для исключения или пакета serilog-enrichers-demystify NuGet, если вы используете Serilog.

1

Этого следует избегать вообще. И ElasticSearch, и Serilog не разработаны с учетом того, что вы будете сериализовывать произвольные объекты. Запись объектов с конфликтующими фигурами приведет к отображению исключений в ElasticSearch. Если вы используете приемник ElasticSearch в NuGet, все, что приводит к конфликту с отображением, будет потеряно. Кроме того, Serilog не обрабатывает циклические отношения, поэтому это приведет к ошибкам самобога. Существует проект, который пытается решить эту проблему путем деструктурирования в словарях и передачи этого в Serilog, но вы все равно столкнетесь с беспорядочными журналами и исключениями отображения.

Serilog: https://nblumhardt.com/2016/02/serilog-tip-dont-serialize-arbitrary-objects/

Я нашел, что лучше конкретно о регистрации свойства исключения, основанном на том, что вы нашли полезными в исключении.

+0

Я использую ElasicSearch 5 с Serilog. Исключения для регистрации всего сообщения, но я использую раковину RollingFile с Filebeat 5, а не ElasticSearch Sink. У меня нет каких-либо картографических исключений, но у меня есть длинный список свойств в Кибане. У меня есть недостаток, связанный с документированием списка общих свойств, которые встречаются во всех журналах. Что касается serilalization, Serilog.Exceptions предоставляет способ регистрировать свойства исключений без использования отражения для общих типов исключений, и вы можете создавать свои собственные. Тем не менее, у меня не было проблем с использованием отражения, где тип исключения не поддерживается. –

+1

Одной из проблем с приемником Serilog ElasticSearch является то, что вы не увидите отображения исключений, оно просто будет потеряно из-за этой проблемы: https://github.com/serilog/serilog-sinks-elasticsearch/issues/25 –

Смежные вопросы