InterpolatedLogging.Microsoft.Extensions.Logging 5.0.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package InterpolatedLogging.Microsoft.Extensions.Logging --version 5.0.0
NuGet\Install-Package InterpolatedLogging.Microsoft.Extensions.Logging -Version 5.0.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="InterpolatedLogging.Microsoft.Extensions.Logging" Version="5.0.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add InterpolatedLogging.Microsoft.Extensions.Logging --version 5.0.0
#r "nuget: InterpolatedLogging.Microsoft.Extensions.Logging, 5.0.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install InterpolatedLogging.Microsoft.Extensions.Logging as a Cake Addin
#addin nuget:?package=InterpolatedLogging.Microsoft.Extensions.Logging&version=5.0.0

// Install InterpolatedLogging.Microsoft.Extensions.Logging as a Cake Tool
#tool nuget:?package=InterpolatedLogging.Microsoft.Extensions.Logging&version=5.0.0

Interpolated Logging

Extensions to Microsoft.Extensions.Logging Library to write Log Messages using Interpolated Strings without losing Structured Property Names

Most logging libraries support structured logging:

logger.Info("User {UserName} created Order {OrderId} at {Date}, operation took {OperationElapsedTime}ms", 
    name, orderId, DateTime.Now, elapsedTime);

This means that our logs will get not only plain strings but also the structured data, allowing us to search for specific property values (e.g. search for OrderId="123" to trace some order, or search for OperationElapsedTime>1000 to find slow operations).

The problem with this approach is that it's easy to put the wrong number of parameters or wrong order of parameters (the parameters at the end are positional, they are not matched with the message by their names).

If you just use regular interpolated strings you lose the benefit of structured logging, since the logging library won't know the names of each property:

logger.Info($"User {UserName} created Order {OrderId} at {Date}, operation took {OperationElapsedTime}ms");

This library solves this problem by creating extensions to popular logging libraries which allow us to use string interpolation (easier to write) and yet set the name of the properties:

logger.InterpolatedInfo($"User {new { UserName = name }} created Order {new { OrderId = orderId}} at {new { Date = now }}, operation took {new { OperationElapsedTime = elapsedTime }}ms");

Quickstart

  1. Install the NuGet package InterpolatedLogging.Microsoft.Extensions.Logging
  2. Start using like this:
using Microsoft.Extensions.Logging; // for easier use our extensions use the same namespace of Microsoft.Extensions.Logging
// ...

logger.InterpolatedInformation($"User {new { UserName = name }} created Order {new { OrderId = orderId}} at {new { Date = now }}, operation took {new { OperationElapsedTime = elapsedTime }}ms");
// there are also extensions for Debug, Verbose,  etc, and also the overloads which take an Exception

// in plain Microsoft.Extensions.Logging this would be equivalent of:
//logger.Information("User {UserName} created Order {OrderId} at {Date}, operation took {OperationElapsedTime}ms", name, orderId, DateTime.Now, elapsedTime);

Raw strings

If you want to embed raw strings in your messages (don't want them to be saved as structured properties), you don't need to create an anonymous object and you can just use the raw modifier:

logger.InterpolatedInformation($"User {new { UserName = name }} logged as {role:raw}");

Collaborate

This is a brand new project, and your contribution can help a lot.

Would you like to collaborate?

Please submit a pull request or if you prefer you can create an issue or contact me to discuss your idea.

License

MIT License

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 is compatible.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
5.1.0 13,521 1/8/2023
5.0.6 12,228 2/14/2022
5.0.5 689 2/14/2022
5.0.4 692 2/13/2022
5.0.1 1,878 4/11/2021
5.0.0 560 4/10/2021