mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 10:34:30 +08:00
fix(logging): 修复异步日志追加器中的操作取消异常处理
- 添加对 OperationCanceledException 的特殊处理,避免将其报告为后台处理错误 - 在 ReportProcessingError 方法中检查并过滤掉操作取消异常 - 添加单元测试验证当内部追加器抛出 OperationCanceledException 时不报告错误 - 创建 CancellationAppender 测试辅助类来模拟取消异常场景 - 确保取消相关的异常不会触发错误处理逻辑
This commit is contained in:
parent
49609d3821
commit
d94d8deb29
@ -1,4 +1,3 @@
|
|||||||
using GFramework.Core.Abstractions.Logging;
|
|
||||||
using GFramework.Core.Logging.Appenders;
|
using GFramework.Core.Logging.Appenders;
|
||||||
|
|
||||||
namespace GFramework.Core.Tests.Logging;
|
namespace GFramework.Core.Tests.Logging;
|
||||||
@ -197,6 +196,29 @@ public class AsyncLogAppenderTests
|
|||||||
Assert.That(asyncAppender.Flush(), Is.True);
|
Assert.That(asyncAppender.Flush(), Is.True);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Append_WhenInnerAppenderThrowsOperationCanceledException_ShouldNotReportError()
|
||||||
|
{
|
||||||
|
var reportedExceptions = new List<Exception>();
|
||||||
|
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
|
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()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -1,4 +1,3 @@
|
|||||||
using System.Threading.Channels;
|
|
||||||
using GFramework.Core.Abstractions.Logging;
|
using GFramework.Core.Abstractions.Logging;
|
||||||
|
|
||||||
namespace GFramework.Core.Logging.Appenders;
|
namespace GFramework.Core.Logging.Appenders;
|
||||||
@ -212,10 +211,16 @@ public sealed class AsyncLogAppender : ILogAppender
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 上报后台处理异常,同时隔离观察者自身抛出的错误,避免终止处理循环。
|
/// 上报后台处理异常,同时隔离观察者自身抛出的错误,避免终止处理循环。
|
||||||
|
/// 取消相关异常表示关闭流程中的预期控制流,不应被视为后台处理失败。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="exception">后台处理中捕获到的异常。</param>
|
/// <param name="exception">后台处理中捕获到的异常。</param>
|
||||||
private void ReportProcessingError(Exception exception)
|
private void ReportProcessingError(Exception exception)
|
||||||
{
|
{
|
||||||
|
if (exception is OperationCanceledException)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (_processingErrorHandler is null)
|
if (_processingErrorHandler is null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user