Serilog Exceptions

v8.4.0·Updated 2026-04-23

NuGet Serilog.Exceptions package re-bundled for convenient consumption and dependency management.

Screenshots 1 screenshots

About this mod Author’s original text

Serilog.Exceptions is an add-on to Serilog to log exception details and custom properties that are not output in Exception.ToString().

What Does It Do?

Your JSON logs will now be supplemented with detailed exception information and even custom exception properties. Here is an example of what happens when you log a DbEntityValidationException from EntityFramework (This exception is notorious for having deeply nested custom properties which are not included in the.ToString()).

try

{...

}

catch (DbEntityValidationException exception)

{

logger.Error(exception, "Hello World");

}

The code above logs the following:

{

"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"

}

}

Getting Started

Add the Serilog.Exceptions NuGet package to your project using the NuGet Package Manager or run the following command in the Package Console Window:

dotnet add package Serilog.Exceptions

When setting up your logger, add the WithExceptionDetails() line like so:

using Serilog;

using Serilog.Exceptions;

ILogger logger = new LoggerConfiguration().Enrich.WithExceptionDetails().WriteTo.RollingFile(

new JsonFormatter(renderMessage: true),

@"C:\logs\log-{Date}.txt").CreateLogger();

Make sure that the sink's formatter outputs enriched properties. Serilog.Sinks.Console and many more do not do that by default. You may need to add {Properties:j} to your sink's format template. For example, configuration for console sink may look like that:.WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception} {Properties:j}")

JSON appSettings.json configuration

Alternatively to fluent configuration setting can be stored in application configuration using _Serilog.Settings.Configuration_:

{

"Serilog": {

"Using": [ "Serilog.Exceptions" ],

"Enrich": [ "WithExceptionDetails" ],

"WriteTo": [

{ "Name": "Console" }

]

}

}

Performance

This library has custom code to deal with extra properties on most common exception types and only falls back to using reflection to get the extra information if the exception is not supported by Serilog.Exceptions internally. Reflection overhead is present but minimal, because all the expensive relection-based operations are done only once per exception-type.

Additional Destructurers

Serilog.Exceptions.SqlServer

Add the Serilog.Exceptions.SqlServer NuGet package to your project to avoid the reflection based destructurer for SqlException when using System.Data.SqlClient:

Install-Package Serilog.Exceptions.SqlServer

Add the SqlExceptionDestructurer during setup:.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder().WithDefaultDestructurers().WithDestructurers(new { new SqlExceptionDestructurer() }))

Serilog.Exceptions.MsSqlServer

Add the Serilog.Exceptions.MsSqlServer NuGet package to your project to avoid the reflection based destructurer for SqlException when using Microsoft.Data.SqlClient:

Install-Package Serilog.Exceptions.MsSqlServer

Add the SqlExceptionDestructurer during setup:.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder().WithD

Install & use Install: BepInEx plugin

  1. The archive from playbuff is the mod itself — usually a BepInEx plugin (a .dll or a plugin folder once unzipped).
  2. Recommended: use a community mod manager (such as r2modman) — pick this game, import the mod, and the manager sets up BepInEx and its dependencies for you.
  3. Manual route: install the BepInEx loader in the game folder, then drop the unzipped .dll or plugin folder into BepInEx/plugins/.
  4. Launch the game — the BepInEx console logs every plugin it loads; seeing this mod in the log means it is installed.

Mods with listed dependencies need those installed too, or they will not load. Options are usually changed in-game or in the plugin's config file.

Dependencies

Install these first, or the mod will not work:

dotnet_lethal_company-Serilogdotnet_lethal_company-System_Reflection_TypeExtensions

File & checksum

Filename
Serilog_Exceptions-8.4.0.zip
File size
42.6 KiB