59 lines
1.8 KiB
C#
59 lines
1.8 KiB
C#
using System.Diagnostics;
|
|
using MediatR;
|
|
|
|
namespace MiningService.API.Application.Behaviors;
|
|
|
|
/// <summary>
|
|
/// EN: MediatR behavior for logging request handling.
|
|
/// VI: MediatR behavior để logging việc xử lý request.
|
|
/// </summary>
|
|
/// <typeparam name="TRequest">EN: Request type / VI: Loại request</typeparam>
|
|
/// <typeparam name="TResponse">EN: Response type / VI: Loại response</typeparam>
|
|
public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
|
|
where TRequest : IRequest<TResponse>
|
|
{
|
|
private readonly ILogger<LoggingBehavior<TRequest, TResponse>> _logger;
|
|
|
|
public LoggingBehavior(ILogger<LoggingBehavior<TRequest, TResponse>> logger)
|
|
{
|
|
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
|
}
|
|
|
|
public async Task<TResponse> Handle(
|
|
TRequest request,
|
|
RequestHandlerDelegate<TResponse> 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;
|
|
}
|
|
}
|
|
}
|