using MediatR; using Microsoft.Extensions.Logging; using System.Diagnostics; namespace DocumentOperator.Application.Common.Behaviors; /// /// MediatR Pipeline Behavior that logs requests and tracks performance /// Executes AFTER ValidationBehavior, BEFORE Handler /// public class LoggingBehavior : IPipelineBehavior where TRequest : IRequest { private readonly ILogger> _logger; public LoggingBehavior(ILogger> logger) { _logger = logger; } public async Task Handle( TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) { var requestName = typeof(TRequest).Name; // Request Start _logger.LogInformation("Handling {RequestName}: {@Request}", requestName, request); // Performance Tracking var stopwatch = Stopwatch.StartNew(); try { // Handler ausführen var response = await next(); stopwatch.Stop(); // Request Success _logger.LogInformation( "Handled {RequestName} in {ElapsedMs}ms", requestName, stopwatch.ElapsedMilliseconds ); return response; } catch (Exception ex) { stopwatch.Stop(); // Request Failed _logger.LogError( ex, "Error handling {RequestName} after {ElapsedMs}ms: {ErrorMessage}", requestName, stopwatch.ElapsedMilliseconds, ex.Message ); throw; // Exception weiterwerfen (wird von Exception Middleware gefangen) } } }