• Stars
    star
    312
  • Rank 134,133 (Top 3 %)
  • Language
    C#
  • License
    Apache License 2.0
  • Created over 9 years ago
  • Updated 4 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Serilog provider for Microsoft.Extensions.Logging

Serilog.Extensions.Logging Build status NuGet Version

A Serilog provider for Microsoft.Extensions.Logging, the logging subsystem used by ASP.NET Core.

ASP.NET Core Instructions

ASP.NET Core applications should prefer Serilog.AspNetCore and UseSerilog() instead.

Non-web .NET Core Instructions

Non-web .NET Core applications should prefer Serilog.Extensions.Hosting and UseSerilog() instead.

.NET Core 1.0, 1.1 and Default Provider Integration

The package implements AddSerilog() on ILoggingBuilder and ILoggerFactory to enable the Serilog provider under the default Microsoft.Extensions.Logging implementation.

First, install the Serilog.Extensions.Logging NuGet package into your web or console app. You will need a way to view the log messages - Serilog.Sinks.Console writes these to the console.

dotnet add package Serilog.Extensions.Logging
dotnet add package Serilog.Sinks.Console

Next, in your application's Startup method, configure Serilog first:

using Serilog;

public class Startup
{
  public Startup(IHostingEnvironment env)
  {
    Log.Logger = new LoggerConfiguration()
      .Enrich.FromLogContext()
      .WriteTo.Console()
      .CreateLogger();

    // Other startup code

Finally, for .NET Core 2.0+, in your Startup class's Configure() method, remove the existing logger configuration entries and call AddSerilog() on the provided loggingBuilder.

  public void ConfigureServices(IServiceCollection services)
  {
      services.AddLogging(loggingBuilder =>
      	loggingBuilder.AddSerilog(dispose: true));

      // Other services ...
  }

For .NET Core 1.0 or 1.1, in your Startup class's Configure() method, remove the existing logger configuration entries and call AddSerilog() on the provided loggerFactory.

  public void Configure(IApplicationBuilder app,
                        IHostingEnvironment env,
                        ILoggerFactory loggerfactory,
                        IApplicationLifetime appLifetime)
  {
      loggerfactory.AddSerilog();

      // Ensure any buffered events are sent at shutdown
      appLifetime.ApplicationStopped.Register(Log.CloseAndFlush);

That's it! With the level bumped up a little you should see log output like:

[22:14:44.646 DBG] RouteCollection.RouteAsync
	Routes:
		Microsoft.AspNet.Mvc.Routing.AttributeRoute
		{controller=Home}/{action=Index}/{id?}
	Handled? True
[22:14:44.647 DBG] RouterMiddleware.Invoke
	Handled? True
[22:14:45.706 DBG] /lib/jquery/jquery.js not modified
[22:14:45.706 DBG] /css/site.css not modified
[22:14:45.741 DBG] Handled. Status code: 304 File: /css/site.css

Notes on Log Scopes

Microsoft.Extensions.Logging provides the BeginScope API, which can be used to add arbitrary properties to log events within a certain region of code. The API comes in two forms:

  1. The method: IDisposable BeginScope<TState>(TState state)
  2. The extension method: IDisposable BeginScope(this ILogger logger, string messageFormat, params object[] args)

Using the extension method will add a Scope property to your log events. This is most useful for adding simple "scope strings" to your events, as in the following code:

using (_logger.BeginScope("Transaction")) {
    _logger.LogInformation("Beginning...");
    _logger.LogInformation("Completed in {DurationMs}ms...", 30);
}
// Example JSON output:
// {"@t":"2020-10-29T19:05:56.4126822Z","@m":"Beginning...","@i":"f6a328e9","SourceContext":"SomeNamespace.SomeService","Scope":["Transaction"]}
// {"@t":"2020-10-29T19:05:56.4176816Z","@m":"Completed in 30ms...","@i":"51812baa","DurationMs":30,"SourceContext":"SomeNamespace.SomeService","Scope":["Transaction"]}

If you simply want to add a "bag" of additional properties to your log events, however, this extension method approach can be overly verbose. For example, to add TransactionId and ResponseJson properties to your log events, you would have to do something like the following:

// WRONG! Prefer the dictionary approach below instead
using (_logger.BeginScope("TransactionId: {TransactionId}, ResponseJson: {ResponseJson}", 12345, jsonString)) {
    _logger.LogInformation("Completed in {DurationMs}ms...", 30);
}
// Example JSON output:
// {
//	"@t":"2020-10-29T19:05:56.4176816Z",
//	"@m":"Completed in 30ms...",
//	"@i":"51812baa",
//	"DurationMs":30,
//	"SourceContext":"SomeNamespace.SomeService",
//	"TransactionId": 12345,
//	"ResponseJson": "{ \"Key1\": \"Value1\", \"Key2\": \"Value2\" }",
//	"Scope":["TransactionId: 12345, ResponseJson: { \"Key1\": \"Value1\", \"Key2\": \"Value2\" }"]
// }

Not only does this add the unnecessary Scope property to your event, but it also duplicates serialized values between Scope and the intended properties, as you can see here with ResponseJson. If this were "real" JSON like an API response, then a potentially very large block of text would be duplicated within your log event! Moreover, the template string within BeginScope is rather arbitrary when all you want to do is add a bag of properties, and you start mixing enriching concerns with formatting concerns.

A far better alternative is to use the BeginScope<TState>(TState state) method. If you provide any IEnumerable<KeyValuePair<string, object>> to this method, then Serilog will output the key/value pairs as structured properties without the Scope property, as in this example:

var scopeProps = new Dictionary<string, object> {
    { "TransactionId", 12345 },
    { "ResponseJson", jsonString },
};
using (_logger.BeginScope(scopeProps) {
    _logger.LogInformation("Transaction completed in {DurationMs}ms...", 30);
}
// Example JSON output:
// {
//	"@t":"2020-10-29T19:05:56.4176816Z",
//	"@m":"Completed in 30ms...",
//	"@i":"51812baa",
//	"DurationMs":30,
//	"SourceContext":"SomeNamespace.SomeService",
//	"TransactionId": 12345,
//	"ResponseJson": "{ \"Key1\": \"Value1\", \"Key2\": \"Value2\" }"
// }

Versioning

This package tracks the versioning and target framework support of its Microsoft.Extensions.Logging dependency.

Credits

This package evolved from an earlier package Microsoft.Framework.Logging.Serilog provided by the ASP.NET team.

More Repositories

1

serilog

Simple .NET logging with fully-structured events
C#
7,150
star
2

serilog-aspnetcore

Serilog integration for ASP.NET Core
C#
1,306
star
3

serilog-settings-configuration

A Serilog configuration provider that reads from Microsoft.Extensions.Configuration
C#
443
star
4

serilog-sinks-file

Write Serilog events to files in text and JSON formats, optionally rolling on time or size
C#
331
star
5

serilog-sinks-console

Write log events to System.Console as text or JSON, with ANSI theme support
C#
240
star
6

serilog-sinks-async

An asynchronous wrapper for Serilog sinks that logs on a background thread
C#
231
star
7

serilog-expressions

An embeddable mini-language for filtering, enriching, and formatting Serilog events, ideal for use with JSON or XML configuration.
C#
187
star
8

serilog-sinks-mssqlserver

A Serilog sink that writes events to Microsoft SQL Server
C#
169
star
9

serilog-extensions-logging-file

Add file logging to ASP.NET Core apps in one line of code.
C#
154
star
10

serilog-formatting-compact

Compact JSON event format for Serilog
C#
153
star
11

serilog-extensions-hosting

Serilog logging for Microsoft.Extensions.Hosting
C#
139
star
12

serilog-sinks-opentelemetry

A Serilog OpenTelemetry Protocol (OTLP) sink
C#
116
star
13

serilog-filters-expressions

Expression-based event filtering for Serilog
C#
80
star
14

serilog-enrichers-environment

Enrich Serilog log events with properties from System.Environment.
C#
77
star
15

serilog-sinks-email

A Serilog sink that writes events to SMTP email
C#
72
star
16

serilog-sinks-periodicbatching

Infrastructure for Serilog sinks that process events in batches.
C#
70
star
17

serilog-sinks-browserconsole

A console sink for the Blazor/Wasm environment
C#
61
star
18

serilog-sinks-rollingfile

Deprecated: new applications should use https://github.com/serilog/serilog-sinks-file instead
C#
60
star
19

serilog-sinks-xamarin

A Serilog sink that writes events to Xamarin mobile targets
C#
54
star
20

serilog-sinks-eventlog

A Serilog sink that writes events to the Windows Event Log
C#
50
star
21

serilog-settings-appsettings

An <appSettings> configuration reader for Serilog
C#
50
star
22

serilog-enrichers-thread

Enrich Serilog events with properties from the current thread.
C#
46
star
23

serilog-sinks-map

A Serilog sink wrapper that dispatches events based on a property value
C#
41
star
24

serilog-sinks-debug

Writes Serilog events to the debug output window
C#
35
star
25

serilog-formatting-compact-reader

A reader for Serilog's compact JSON format
C#
32
star
26

serilog-sinks-loggly

A Serilog event sink that writes to Loggly
C#
27
star
27

serilog-enrichers-process

The process enricher for Serilog.
C#
26
star
28

serilog-sinks-observable

Write Serilog events to observers (Rx) through an IObservable
C#
23
star
29

serilog-sinks-azuredocumentdb

A Serilog sink that writes to Azure DocumentDB
C#
17
star
30

serilog-sinks-amazonkinesis

A Serilog sink that logs to Amazon Kinesis
C#
14
star
31

serilog-sinks-signalr

A Serilog sink that writes events to SignalR
C#
14
star
32

serilog-sinks-log4net

A Serilog sink that writes events to log4net
C#
13
star
33

serilog-sinks-trace

The diagnostic trace sink for Serilog.
C#
11
star
34

serilog-sinks-coloredconsole

Deprecated: now a part of https://github.com/serilog/serilog-sinks-console
C#
10
star
35

serilog-sinks-datadog

A Serilog sink that writes events to DataDog
C#
9
star
36

serilog-sinks-logentries

A Serilog sink that writes events to Logentries
C#
8
star
37

serilog-sinks-nlog

A Serilog sink that writes events to NLog
C#
8
star
38

serilog-sinks-textwriter

The System.IO.TextWriter sink for Serilog
C#
8
star
39

serilog-generator

A simulation that generates simple log data through Serilog, ideal for testing sinks or log servers
C#
6
star
40

serilog-sinks-rethinkdb

A Serilog sink that writes to RethinkDB
C#
5
star
41

serilog-sinks-xsockets

A Serilog sink that writes events to XSockets
C#
4
star
42

serilog-sinks-reflectinsight

Writes events from Serilog to the ReflectInsight logging framework
C#
3
star
43

serilog-dnx-prerelease

Pre-release support for the DNX (.NET 5) runtime environment for Serilog
C#
3
star
44

serilog-sinks-dynamodb

A Serilog sink that writes events to Amazon Web Services DynamoDB
C#
1
star