Посмотрите на 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.
Спасибо за ответ. Я посмотрю на реализацию Томаса. –
Обратите внимание, что ответ ниже относится к полной реализации оригинальной идеи в связанном Gist, доступном в github, и как пакет Nuget Serilog.Exceptions. – JotaBe