using System.Diagnostics; using MediatR; namespace MiningService.API.Application.Behaviors; /// /// EN: MediatR behavior for logging request handling. /// VI: MediatR behavior để logging việc xử lý request. /// /// EN: Request type / VI: Loại request /// EN: Response type / VI: Loại response public class LoggingBehavior : IPipelineBehavior where TRequest : IRequest { private readonly ILogger> _logger; public LoggingBehavior(ILogger> logger) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public async Task Handle( TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) { var requestName = typeof(TRequest).Name; _logger.LogInformation( "Handling {RequestName} / Đang xử lý {RequestName}", requestName); var stopwatch = Stopwatch.StartNew(); try { var response = await next(); stopwatch.Stop(); _logger.LogInformation( "Handled {RequestName} in {ElapsedMs}ms / Đã xử lý {RequestName} trong {ElapsedMs}ms", requestName, stopwatch.ElapsedMilliseconds); return response; } catch (Exception ex) { stopwatch.Stop(); _logger.LogError(ex, "Error handling {RequestName} after {ElapsedMs}ms / Lỗi xử lý {RequestName} sau {ElapsedMs}ms", requestName, stopwatch.ElapsedMilliseconds); throw; } } }