Elastic.Serilog.Sinks 8.12.3

Prefix Reserved
dotnet add package Elastic.Serilog.Sinks --version 8.12.3                
NuGet\Install-Package Elastic.Serilog.Sinks -Version 8.12.3                
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="Elastic.Serilog.Sinks" Version="8.12.3" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Elastic.Serilog.Sinks --version 8.12.3                
#r "nuget: Elastic.Serilog.Sinks, 8.12.3"                
#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 Elastic.Serilog.Sinks as a Cake Addin
#addin nuget:?package=Elastic.Serilog.Sinks&version=8.12.3

// Install Elastic.Serilog.Sinks as a Cake Tool
#tool nuget:?package=Elastic.Serilog.Sinks&version=8.12.3                

Elastic.Serilog.Sinks

A Serilog sink that writes logs directly to Elasticsearch or Elastic Cloud using the Elastic Common Schema.

Example

There's a few ways that you can extend a Serilog LoggerConfiguration:

Log.Logger = new LoggerConfiguration()
	.MinimumLevel.Debug()
	.Enrich.FromLogContext()

NOTE: Don't forget we also publish an Elastic.Apm.SerilogEnricher for the Elastic APM Agent!

Writing to Elasticsearch

.WriteTo.Elasticsearch(new [] { new Uri("http://localhost:9200" )}, opts =>
{
	opts.DataStream = new DataStreamName("logs", "console-example", "demo");
	opts.BootstrapMethod = BootstrapMethod.Failure;
	opts.ConfigureChannel = channelOpts =>
	{
		channelOpts.BufferOptions = new BufferOptions 
		{ 
			ConcurrentConsumers = 10 
		};
	};
})

Writing to Elastic Cloud:

.WriteTo.ElasticCloud("cloudId", "cloudUser", "cloudPass", opts =>

opts is an instance of ElasticsearchSinkOptions with the following options

Option Description
Transport An instance of Elastic.Transport that dictates where and how wer are communicating to. Defaults to http://localhost:9200
DataStream Where to write data, defaults to the logs-dotnet-default datastream.
BootstrapMethod Wheter the sink should attempt to install component and index templates to ensure the datastream has ECS mappings. Can be be either None (the default), Silent (attempt but fail silently), Failure (attempt and fail with exceptions if bootstrapping fails).
TextFormatting Allows explicit control of over the EcsTextFormatterConfiguration used to emit ECS json documents. See Elastic.CommonSchema.Serilog for available options.
ConfigureChannel A callback receiving the DatastreamChannelOptions which allows you to control sizing, backpressure etc. See Elastic.Ingest.Elasticsearch for more information.

Note that you can also pass ElasticsearchSinkOptions directly

.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(client.Transport)

This allows you to reuse the Transport used by the Elasticsearch Client for instance.

ECS Aware Message Templates

This sink by proxy of its formatter allows you to set ECS fields directly from the message template using properties that adhere to the https://messagetemplates.org/ format.

The available ECS message template properties are listed under LogTemplateProperties.* e.g LogTemplateProperties.TraceId

Log.Information("The time is {TraceId}", "my-trace-id");

Will override trace.id on the resulting ECS json document.

Application Settings Configuration

This sink can be configured through appsettings.json when used in combination with Serilog.Settings.Configuration.

Elasticsearch appsettings configuration

When configuring through appsettings only the bootstrapMethod configuration is required

{
  "Serilog": {
    "Using": [ "Elastic.Serilog.Sinks" ],
    "MinimumLevel": { "Default": "Information" },
    "WriteTo": [
      {
        "Name": "Elasticsearch",
        "Args": {
          "bootstrapMethod": "Silent",
          "nodes": [ "http://elastichost:9200" ],
          "useSniffing": true,
          "apiKey": "<apiKey>",
          "username": "<username>",
          "password": "<password>",

          "ilmPolicy" : "my-policy",
          "dataStream" : "logs-dotnet-default",
          "includeHost" : true,
          "includeUser" : true,
          "includeProcess" : true,
          "includeActivity" : true,
          "filterProperties" : [ "prop1", "prop2" ],
          "proxy": "http://localhost:8200",
          "proxyUsername": "x",
          "proxyPassword": "y",
          "debugMode": false,

          //EXPERT settings, do not set unless you need to 
          "maxRetries": 3,
          "maxConcurrency": 20,
          "maxInflight": 100000,
          "maxExportSize": 1000,
          "maxLifeTime": "00:00:05",
          "fullMode": "Wait"
        }
      }
    ]
  }
}
Elastic Cloud appsettings configuration

When configuring through appsettings only the bootstrapMethod configuration is required

You can specify either endpoint or cloudId, cloudId will take precedence.

You'll need to specify either apiKey or username and password.

{
  "Serilog": {
    "Using": [ "Elastic.Serilog.Sinks" ],
    "MinimumLevel": { "Default": "Information" },
    "WriteTo": [
      {
        "Name": "ElasticCloud",
        "Args": {
          "bootstrapMethod": "Silent",
          "endpoint": "https://<redacted>.es.us-central1.gcp.cloud.es.io",
          "cloudId": "<cloudId>",
          "apiKey": "<apiKey>",
          "username": "<username>",
          "password": "<password>",
          
          "ilmPolicy" : "my-policy",
          "dataStream" : "logs-dotnet-default",
          "includeHost" : true,
          "includeUser" : true,
          "includeProcess" : true,
          "includeActivity" : true,
          "filterProperties" : [ "prop1", "prop2" ],
          "proxy": "http://localhost:8200",
          "proxyUsername": "x",
          "proxyPassword": "y",
          "debugMode": false,

          //EXPERT settings, do not set unless you need to 
          "maxRetries": 3,
          "maxConcurrency": 20,
          "maxInflight": 100000,
          "maxExportSize": 1000,
          "maxLifeTime": "00:00:05",
          "fullMode": "Wait"
        }
      }
    ]
  }
}

Comparison with Serilog.Sinks.Elasticsearch

  • Serilog.Sinks.Elasticsearch is an amazing community led sink that has a ton of options and works against older Elasticsearch versions < 8.0.
  • Serilog.Sinks.Elasticsearch is unofficially supported by Elastic with some of the .NET team helping to maintain it.
  • Elastic.Serilog.Sinks is officially supported by Elastic and was purposely build to adhere to newer best practices around logging, datastreams and ILM.
  • Elastic.Serilog.Sinks is purposely build to have fewer configuration options and be more prescriptive than Serilog.Sinks.Elasticsearch.
    • That is not to say there aren't plenty of configuration hooks in Elastic.Serilog.Sinks
Notable absent features:
  • Elastic.Serilog.Sinks only works with Elasticsearch 8.x and up.
    • This is because the bootrapping (BootstrapMethod) attempts to load templates build for Elasticsearch 8.0 and up.
  • Elastic.Serilog.Sinks has only one way it emits data to Elasticsearch confirming to the ecs-logging specification
    • That doesn't mean you can not introduce your own additional properties though.
  • Elastic.Serilog.Sinks has no durable mode.

If you miss a particular feature from Serilog.Sinks.Elasticsearch in Elastic.Serilog.Sinks please open a feature request! We'd love to grow this sink organically moving forward.

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 is compatible. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  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 (18)

Showing the top 5 NuGet packages that depend on Elastic.Serilog.Sinks:

Package Downloads
Intility.Extensions.Logging.Elasticsearch

Enable Elasticsearch logging provider.

Xinghe.Utility

XH基础库(内部使用)

TinyFx.Extensions.Serilog

Serilog封装

Delfin.Core.Infrastructure

An Infrastructure Layer library designed for Clean Architecture in .NET applications. This package provides the implementation of cross-cutting concerns such as data access, external service integration, and configuration management, ensuring that the application layers remain decoupled from infrastructure details.

amorphie.core

amorphie.core

GitHub repositories (3)

Showing the top 3 popular GitHub repositories that depend on Elastic.Serilog.Sinks:

Repository Stars
mehdihadeli/food-delivery-microservices
🍔 A practical and imaginary food delivery microservices, built with .Net 8, MassTransit, Domain-Driven Design, CQRS, Vertical Slice Architecture, Event-Driven Architecture, and the latest technologies.
BehzadDara/SampleProject
mehdihadeli/vertical-slice-api-template
An asp.net core template based on .Net 8, Vertical Slice Architecture, CQRS, Minimal APIs, API Versioning and Swagger.
Version Downloads Last updated
8.12.3 597 11/26/2024
8.12.2 58,213 10/22/2024
8.12.1 51,521 10/3/2024
8.12.0 20,036 9/26/2024
8.11.1 309,742 6/10/2024
8.11.0 113,905 4/10/2024
8.6.1 538,853 8/3/2023
8.6.0 89,149 5/9/2023