perf(cqrs): 优化LoggingBehavior性能并改进错误处理

- 添加Stopwatch用于精确测量请求处理时间
- 将Handle方法改为异步方法并正确await next调用
- 在成功和失败情况下都记录详细的耗时信息
- 添加对OperationCanceledException的特殊处理和日志记录
- 改进异常处理逻辑以包含执行时间信息
This commit is contained in:
GeWuYou 2026-02-14 19:14:38 +08:00 committed by gewuyou
parent 35d05a46fa
commit 276f50a255

View File

@ -11,6 +11,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
using System.Diagnostics;
using GFramework.Core.Abstractions.logging; using GFramework.Core.Abstractions.logging;
using GFramework.Core.logging; using GFramework.Core.logging;
using Mediator; using Mediator;
@ -37,22 +38,34 @@ public sealed class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRe
/// <param name="next">下一个处理委托,用于继续管道执行</param> /// <param name="next">下一个处理委托,用于继续管道执行</param>
/// <param name="cancellationToken">取消令牌,用于取消操作</param> /// <param name="cancellationToken">取消令牌,用于取消操作</param>
/// <returns>处理结果的ValueTask</returns> /// <returns>处理结果的ValueTask</returns>
public ValueTask<TResponse> Handle(TRequest message, MessageHandlerDelegate<TRequest, TResponse> next, public async ValueTask<TResponse> Handle(
TRequest message,
MessageHandlerDelegate<TRequest, TResponse> next,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var requestName = typeof(TRequest).Name; var requestName = typeof(TRequest).Name;
var start = Stopwatch.GetTimestamp();
_logger.Debug($"Handling {requestName}"); _logger.Debug($"Handling {requestName}");
try try
{ {
var response = next(message, cancellationToken); var response = await next(message, cancellationToken);
_logger.Debug($"Handled {requestName} successfully");
var elapsed = Stopwatch.GetElapsedTime(start);
_logger.Debug($"Handled {requestName} successfully in {elapsed.TotalMilliseconds} ms");
return response; return response;
} }
catch (OperationCanceledException)
{
_logger.Warn($"Handling {requestName} was cancelled");
throw;
}
catch (Exception ex) catch (Exception ex)
{ {
_logger.Error($"Error handling {requestName}", ex); var elapsed = Stopwatch.GetElapsedTime(start);
_logger.Error($"Error handling {requestName} after {elapsed.TotalMilliseconds} ms", ex);
throw; throw;
} }
} }