Biggets AI error ever
8b3ee00c46bf0c18c3b130e170af6000aea4395a
1 files changed
LoggerExtensions/FileLogger.cs
diff --git a/LoggerExtensions/FileLogger.cs b/LoggerExtensions/FileLogger.cs
index 0a222e4..a78a2c2 100644
--- a/LoggerExtensions/FileLogger.cs
+++ b/LoggerExtensions/FileLogger.cs
@@ -1,5 +1,6 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+using System.Diagnostics;
using System.Threading.Channels;
namespace LoggerExtensions;
@@ -16,6 +17,7 @@ public sealed class FileLogger : ILogger, IDisposable
public FileLogger(string logDirectory = "Logs")
{
+ Debug.WriteLine($"New FileLogger created. Instance hash: {GetHashCode()}");
this.logDirectory = logDirectory;
Directory.CreateDirectory(logDirectory);
@@ -50,19 +52,22 @@ public sealed class FileLogger : ILogger, IDisposable
channel.Writer.TryWrite(message);
}
+
private async Task ConsumeAsync(CancellationToken ct)
{
const int batchSize = 200;
const int maxIdleMs = 4000;
var batch = new List<string>(batchSize);
-
+ Task<string>? readTask = null;
try
{
while (!ct.IsCancellationRequested)
{
- var readTask = channel.Reader.ReadAsync(ct).AsTask();
- var delayTask = Task.Delay(maxIdleMs, ct);
+ readTask ??= channel.Reader.ReadAsync(ct).AsTask();
+
+ using var delayCts = CancellationTokenSource.CreateLinkedTokenSource(ct);
+ var delayTask = Task.Delay(maxIdleMs, delayCts.Token);
var completed = await Task.WhenAny(readTask, delayTask);
@@ -75,8 +80,10 @@ public sealed class FileLogger : ILogger, IDisposable
}
continue;
}
+ delayCts.Cancel();
var message = await readTask;
+ readTask = null;
batch.Add(message);
if (batch.Count >= batchSize)
@@ -121,7 +128,7 @@ public sealed class FileLogger : ILogger, IDisposable
currentDate = today;
currentFilePath = Path.Combine(logDirectory, $"log-{today:yyyyMMdd}.txt");
- var stream = new FileStream(
+ FileStream stream = new (
currentFilePath,
FileMode.Append,
FileAccess.Write,
@@ -158,6 +165,7 @@ public sealed class FileLogger : ILogger, IDisposable
public void Dispose()
{
+
channel.Writer.Complete();
cts.CancelAfter(TimeSpan.FromSeconds(8));