Serilog.Sinks.PeriodicBatching 5.0.1-dev-00860

Serilog.Sinks.PeriodicBatching Build status NuGet Version

A wrapper for Serilog sinks that asynchronously emits events in batches, useful when logging to a slow and/or remote target.

[!IMPORTANT] Serilog 4.x and later versions support batching natively. New projects should use Serilog's IBatchedLogEventSink and WriteTo.Sink(IBatchedLogEventSink), not this package which is now only maintained for compatibility reasons.

Updating for Serilog v4+

First, update your Serilog package reference to the latest published version.

This example is from Serilog.Sinks.Postgresql.Alternative. Old code:

var batchingOptions = new PeriodicBatchingSinkOptions()
{
    BatchSizeLimit = postgresOptions.BatchSizeLimit,
    Period = postgresOptions.Period,
    QueueLimit = postgresOptions.QueueLimit
};

var batchingSink = new PeriodicBatchingSink(new PostgreSqlSink(postgresOptions), batchingOptions);
return sinkConfiguration.Sink(batchingSink, restrictedToMinimumLevel, levelSwitch);

New code:

var batchingOptions = new BatchingOptions()
{
    BatchSizeLimit = postgresOptions.BatchSizeLimit,
    BufferingTimeLimit = postgresOptions.Period,
    QueueLimit = postgresOptions.QueueLimit
};

return sinkConfiguration.Sink(
    new PostgreSqlSink(postgresOptions), batchingOptions, restrictedToMinimumLevel, levelSwitch);

When you're done, don't forget to remove the Serilog.Sinks.PeriodicBatching package dependency.

Getting started

Sinks that, for performance reasons, need to emit events in batches, can be implemented using PeriodicBatchingSink from this package.

First, install the package into your Sink project:

dotnet add package Serilog.Sinks.PeriodicBatching

Then, instead of implementing Serilog's ILogEventSink, implement IBatchedLogEventSink in your sink class:

class ExampleBatchedSink : IBatchedLogEventSink
{
    public async Task EmitBatchAsync(IEnumerable<LogEvent> batch)
    {
        foreach (var logEvent in batch)
            Console.WriteLine(logEvent);
    }
    
    public Task OnEmptyBatchAsync() { }
}

Finally, in your sink's configuration method, construct a PeriodicBatchingSink that wraps your batched sink:

public static class LoggerSinkExampleConfiguration
{
    public static LoggerConfiguration Example(this LoggerSinkConfiguration loggerSinkConfiguration)
    {
        var exampleSink = new ExampleBatchedSink();
        
        var batchingOptions = new PeriodicBatchingSinkOptions
        {
            BatchSizeLimit = 100,
            Period = TimeSpan.FromSeconds(2),
            EagerlyEmitFirstEvent = true,
            QueueLimit = 10000
        };
        
        var batchingSink = new PeriodicBatchingSink(exampleSink, batchingOptions);
        
        return loggerSinkConfiguration.Sink(batchingSink);
    }
}

Showing the top 20 packages that depend on Serilog.Sinks.PeriodicBatching.

Packages Downloads
Serilog.Sinks.Elasticsearch
Package Description
63
Serilog.Sinks.Elasticsearch
Package Description
66
Serilog.Sinks.Elasticsearch
Package Description
67
Serilog.Sinks.Elasticsearch
Package Description
71
Serilog.Sinks.Elasticsearch
Package Description
82
Serilog.Sinks.Elasticsearch
Package Description
84
Serilog.Sinks.Elasticsearch
Package Description
86
Serilog.Sinks.Elasticsearch
Package Description
87
Serilog.Sinks.Elasticsearch
Package Description
90
Serilog.Sinks.Elasticsearch
Package Description
94
Serilog.Sinks.Elasticsearch
Package Description
126
Serilog.Sinks.Elasticsearch
Package Description
1,926
Serilog.Sinks.Elasticsearch
Package Description
3,237
Serilog.Sinks.Elasticsearch
Package Description
25,444
Serilog.Sinks.Elasticsearch
Serilog sink for Elasticsearch
68
Serilog.Sinks.Elasticsearch
Serilog sink for Elasticsearch
69
Serilog.Sinks.Elasticsearch
Serilog.Sinks.Elasticsearch
101
Serilog.Sinks.Elasticsearch
Serilog.Sinks.Elasticsearch
106
Serilog.Sinks.Elasticsearch
The perfect way for .NET apps to write structured log events to Elasticsearch 2.x.
70

.NET Framework 4.6.2

.NET Framework 4.7.1

.NET 6.0

.NET 8.0

.NET Standard 2.0

Version Downloads Last updated
5.0.1-dev-00860 28 07/04/2024
5.0.0 21 06/07/2024
5.0.0-dev-00855 20 06/08/2024
4.1.2-dev-00851 23 06/01/2024
4.1.1 20 05/31/2024
4.1.1-dev-00845 28 05/24/2024
4.1.0 23 05/21/2024
4.1.0-dev-00840 26 05/21/2024
4.0.2-dev-00838 23 05/21/2024
4.0.1 22 03/15/2024
4.0.1-dev-00832 23 03/16/2024
4.0.0 26 03/07/2024
4.0.0-dev-00824 25 03/10/2024
4.0.0-dev-00821 21 03/10/2024
3.1.1-dev-00804 41 06/23/2023
3.1.1-dev-00801 51 10/27/2022
3.1.0 82 10/27/2022
3.1.0-dev-00796 42 09/23/2022
3.0.0 70 09/22/2022
3.0.0-dev-00792 56 09/24/2022
2.3.1 51 07/11/2022
2.3.1-dev-00785 55 09/12/2022
2.3.1-dev-00780 62 09/12/2022
2.3.1-dev-00776 44 09/12/2022
2.3.1-dev-00774 49 09/21/2022
2.3.0 69 07/29/2022
2.3.0-dev-00765 37 09/12/2022
2.3.0-dev-00762 56 06/30/2022
2.3.0-dev-00760 50 09/23/2022
2.2.1-dev-00758 77 09/21/2022
2.2.1-dev-00755 115 09/12/2022
2.2.0 46 09/12/2022
2.2.0-dev-00748 59 09/22/2022
2.2.0-dev-00740 51 09/12/2022
2.1.1 25,952 06/27/2022
2.1.1-dev-00732 39 09/17/2022
2.1.1-dev-00729 60 09/21/2022
2.1.1-dev-00725 48 09/12/2022
2.1.0 39 09/17/2022
2.1.0-dev-00720 38 09/12/2022
2.0.2-dev-00719 38 09/22/2022
2.0.1 41 09/12/2022
2.0.1-dev-00714 51 09/12/2022
2.0.0 90 09/25/2022
2.0.0-rc-707 32 09/12/2022
2.0.0-rc-705 39 10/27/2022
2.0.0-beta-702 44 09/12/2022
2.0.0-beta-700 60 09/12/2022
2.0.0-beta-519 55 09/17/2022
2.0.0-beta-516 45 09/12/2022
2.0.0-beta-513 87 09/12/2022
2.0.0-beta-511 65 09/12/2022
2.0.0-beta-509 62 09/12/2022
2.0.0-beta-507 127 09/12/2022
2.0.0-beta-505 105 09/12/2022
2.0.0-beta-502 33 09/24/2022
2.0.0-beta-499 62 09/12/2022
2.0.0-beta-495 78 09/12/2022
2.0.0-beta-494 59 07/03/2022
2.0.0-beta-493 82 09/22/2022
2.0.0-beta-487 79 09/12/2022
2.0.0-beta-486 68 09/12/2022
2.0.0-beta-479 62 09/22/2022
2.0.0-beta-478 53 09/12/2022
2.0.0-beta-465 48 09/12/2022