diff --git a/src/Serilog.Sinks.PeriodicBatching/Serilog.Sinks.PeriodicBatching.csproj b/src/Serilog.Sinks.PeriodicBatching/Serilog.Sinks.PeriodicBatching.csproj index b2b628d..7409b69 100644 --- a/src/Serilog.Sinks.PeriodicBatching/Serilog.Sinks.PeriodicBatching.csproj +++ b/src/Serilog.Sinks.PeriodicBatching/Serilog.Sinks.PeriodicBatching.csproj @@ -2,7 +2,7 @@ Buffer batches of log events to be flushed asynchronously. - 4.0.0 + 4.0.1 Serilog Contributors net462 $(TargetFrameworks);netstandard2.0;net6.0 diff --git a/src/Serilog.Sinks.PeriodicBatching/Sinks/PeriodicBatching/PeriodicBatchingSink.cs b/src/Serilog.Sinks.PeriodicBatching/Sinks/PeriodicBatching/PeriodicBatchingSink.cs index 78eae64..a14c0e6 100644 --- a/src/Serilog.Sinks.PeriodicBatching/Sinks/PeriodicBatching/PeriodicBatchingSink.cs +++ b/src/Serilog.Sinks.PeriodicBatching/Sinks/PeriodicBatching/PeriodicBatchingSink.cs @@ -121,7 +121,7 @@ async Task LoopAsync() { _currentBatch.Enqueue(next); } - } while ((_currentBatch.Count < _batchSizeLimit || _currentBatch.Count > 0 && isEagerBatch) && + } while ((_currentBatch.Count < _batchSizeLimit && !isEagerBatch || _currentBatch.Count == 0) && !_shutdownSignal.IsCancellationRequested && await TryWaitToReadAsync(_queue.Reader, fillBatch, _shutdownSignal.Token).ConfigureAwait(false)); diff --git a/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs b/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs index 22a7fac..b3cbbf5 100644 --- a/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs +++ b/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs @@ -107,6 +107,44 @@ public void ExecutionContextDoesNotFlowToBatchedSink() pbs.Emit(evt); pbs.Dispose(); - Assert.Equal(default(int), observed); + Assert.Equal(default, observed); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task EagerlyEmitFirstEventCausesQuickInitialBatch(bool eagerlyEmit) + { + long batchesEmitted = 0; + var bs = new CallbackBatchedSink(_ => + { + // ReSharper disable once AccessToModifiedClosure + Interlocked.Increment(ref batchesEmitted); + return Task.CompletedTask; + }); + + var options = new PeriodicBatchingSinkOptions + { + Period = TimeSpan.FromSeconds(2), + EagerlyEmitFirstEvent = eagerlyEmit, + BatchSizeLimit = 10, + QueueLimit = 1000 + }; + + var pbs = new PeriodicBatchingSink(bs, options); + + var evt = Some.InformationEvent(); + pbs.Emit(evt); + + await Task.Delay(1900); + Assert.Equal(eagerlyEmit ? 1L : 0, Interlocked.Read(ref batchesEmitted)); + +#if FEATURE_ASYNCDISPOSABLE + await pbs.DisposeAsync(); +#else + pbs.Dispose(); +#endif + + Assert.Equal(1L, Interlocked.Read(ref batchesEmitted)); } } \ No newline at end of file