From d94d8deb2945b4c3da0e3894fd0d45f272afd70b Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Sat, 21 Mar 2026 21:59:51 +0800 Subject: [PATCH] =?UTF-8?q?fix(logging):=20=E4=BF=AE=E5=A4=8D=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E6=97=A5=E5=BF=97=E8=BF=BD=E5=8A=A0=E5=99=A8=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E6=93=8D=E4=BD=9C=E5=8F=96=E6=B6=88=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加对 OperationCanceledException 的特殊处理,避免将其报告为后台处理错误 - 在 ReportProcessingError 方法中检查并过滤掉操作取消异常 - 添加单元测试验证当内部追加器抛出 OperationCanceledException 时不报告错误 - 创建 CancellationAppender 测试辅助类来模拟取消异常场景 - 确保取消相关的异常不会触发错误处理逻辑 --- .../Logging/AsyncLogAppenderTests.cs | 40 ++++++++++++++++++- .../Logging/Appenders/AsyncLogAppender.cs | 7 +++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/GFramework.Core.Tests/Logging/AsyncLogAppenderTests.cs b/GFramework.Core.Tests/Logging/AsyncLogAppenderTests.cs index cc22646..bd5576a 100644 --- a/GFramework.Core.Tests/Logging/AsyncLogAppenderTests.cs +++ b/GFramework.Core.Tests/Logging/AsyncLogAppenderTests.cs @@ -1,4 +1,3 @@ -using GFramework.Core.Abstractions.Logging; using GFramework.Core.Logging.Appenders; namespace GFramework.Core.Tests.Logging; @@ -197,6 +196,29 @@ public class AsyncLogAppenderTests Assert.That(asyncAppender.Flush(), Is.True); } + [Test] + public void Append_WhenInnerAppenderThrowsOperationCanceledException_ShouldNotReportError() + { + var reportedExceptions = new List(); + var innerAppender = new CancellationAppender(); + using var asyncAppender = new AsyncLogAppender( + innerAppender, + bufferSize: 1000, + processingErrorHandler: reportedExceptions.Add); + + Assert.DoesNotThrow(() => + { + for (int i = 0; i < 10; i++) + { + var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", $"Message {i}", null, null); + asyncAppender.Append(entry); + } + }); + + Assert.That(asyncAppender.Flush(), Is.True); + Assert.That(reportedExceptions, Is.Empty); + } + // 辅助测试类 private class TestAppender : ILogAppender { @@ -257,4 +279,20 @@ public class AsyncLogAppenderTests { } } + + private class CancellationAppender : ILogAppender + { + public void Append(LogEntry entry) + { + throw new OperationCanceledException("Simulated cancellation"); + } + + public void Flush() + { + } + + public void Dispose() + { + } + } } \ No newline at end of file diff --git a/GFramework.Core/Logging/Appenders/AsyncLogAppender.cs b/GFramework.Core/Logging/Appenders/AsyncLogAppender.cs index 9d52b9b..556c7d3 100644 --- a/GFramework.Core/Logging/Appenders/AsyncLogAppender.cs +++ b/GFramework.Core/Logging/Appenders/AsyncLogAppender.cs @@ -1,4 +1,3 @@ -using System.Threading.Channels; using GFramework.Core.Abstractions.Logging; namespace GFramework.Core.Logging.Appenders; @@ -212,10 +211,16 @@ public sealed class AsyncLogAppender : ILogAppender /// /// 上报后台处理异常,同时隔离观察者自身抛出的错误,避免终止处理循环。 + /// 取消相关异常表示关闭流程中的预期控制流,不应被视为后台处理失败。 /// /// 后台处理中捕获到的异常。 private void ReportProcessingError(Exception exception) { + if (exception is OperationCanceledException) + { + return; + } + if (_processingErrorHandler is null) { return;