InterpolatedLogging.Microsoft.Extensions.Logging
5.0.0
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
<PackageReference Include="InterpolatedLogging.Microsoft.Extensions.Logging" Version="5.0.0" />
paket add InterpolatedLogging.Microsoft.Extensions.Logging --version 5.0.0
#r "nuget: InterpolatedLogging.Microsoft.Extensions.Logging, 5.0.0"
// 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
- Install the NuGet package InterpolatedLogging.Microsoft.Extensions.Logging
- 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 | Versions 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. |
-
.NETFramework 4.7.2
- Microsoft.Extensions.Logging (>= 5.0.0)
-
.NETStandard 2.0
- Microsoft.Extensions.Logging (>= 5.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.