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
Microsoft.Extensions.Logging.AzureAppServices
Logger implementation to support Azure App Services 'Diagnostics logs' and 'Log stream' features.
21
Microsoft.Extensions.Logging.AzureAppServices
Logger implementation to support Azure App Services 'Diagnostics logs' and 'Log stream' features.
20
Microsoft.Extensions.Logging.AzureAppServices
Logger implementation to support Azure App Services 'Diagnostics logs' and 'Log stream' features.
19
Microsoft.Extensions.Logging.AzureAppServices
Diagnostics logger for Azure WebApps
18
Microsoft.Extensions.Logging.AzureAppServices
Logger implementation to support Azure App Services 'Diagnostics logs' and 'Log stream' features.
17
Microsoft.Extensions.Logging.AzureAppServices
Logger implementation to support Azure App Services 'Diagnostics logs' and 'Log stream' features.
12

.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 17 8/11/2024
5.0.0 19 8/20/2024
5.0.0-dev-00855 17 7/10/2024
4.1.2-dev-00851 18 8/19/2024
4.1.1 18 7/26/2024
4.1.1-dev-00845 18 8/11/2024
4.1.0 20 8/21/2024
4.1.0-dev-00840 17 7/21/2024
4.0.2-dev-00838 21 7/12/2024
4.0.1 25 4/23/2024
4.0.1-dev-00832 24 3/28/2024
4.0.0 20 3/8/2024
4.0.0-dev-00824 19 3/8/2024
4.0.0-dev-00821 21 3/8/2024
3.1.1-dev-00804 19 3/8/2024
3.1.1-dev-00801 20 3/8/2024
3.1.0 21 3/8/2024
3.1.0-dev-00796 21 3/8/2024
3.0.0 22 3/8/2024
3.0.0-dev-00792 22 3/8/2024
2.3.1 19 3/8/2024
2.3.1-dev-00785 20 3/8/2024
2.3.1-dev-00780 19 3/8/2024
2.3.1-dev-00776 22 3/8/2024
2.3.1-dev-00774 20 3/8/2024
2.3.0 20 3/8/2024
2.3.0-dev-00765 21 3/8/2024
2.3.0-dev-00762 19 3/8/2024
2.3.0-dev-00760 22 3/8/2024
2.2.1-dev-00758 21 3/8/2024
2.2.1-dev-00755 20 3/8/2024
2.2.0 21 3/8/2024
2.2.0-dev-00748 20 3/8/2024
2.2.0-dev-00740 20 3/8/2024
2.1.1 22 3/8/2024
2.1.1-dev-00732 18 3/8/2024
2.1.1-dev-00729 23 3/8/2024
2.1.1-dev-00725 21 3/8/2024
2.1.0 21 3/8/2024
2.1.0-dev-00720 24 3/8/2024
2.0.2-dev-00719 23 3/8/2024
2.0.1 26 3/8/2024
2.0.1-dev-00714 21 3/8/2024
2.0.0 25 3/8/2024
2.0.0-rc-707 24 3/8/2024
2.0.0-rc-705 26 3/8/2024
2.0.0-beta-702 22 3/8/2024
2.0.0-beta-700 19 3/8/2024
2.0.0-beta-519 21 3/8/2024
2.0.0-beta-516 23 3/8/2024
2.0.0-beta-513 20 3/8/2024
2.0.0-beta-511 24 3/8/2024
2.0.0-beta-509 22 3/8/2024
2.0.0-beta-507 24 3/8/2024
2.0.0-beta-505 20 3/8/2024
2.0.0-beta-502 22 3/8/2024
2.0.0-beta-499 19 3/8/2024
2.0.0-beta-495 22 3/8/2024
2.0.0-beta-494 24 3/8/2024
2.0.0-beta-493 25 3/8/2024
2.0.0-beta-487 25 3/8/2024
2.0.0-beta-486 22 3/8/2024
2.0.0-beta-479 22 3/8/2024
2.0.0-beta-478 23 3/8/2024
2.0.0-beta-465 22 3/8/2024