using Grpc.Core;
using Grpc.Core.Interceptors;
using Microsoft.Extensions.Logging;
using System.Text.Json;
using System.Threading.Tasks;
namespace server.Utilierias
{
///
/// Interceptor de gRPC encargado de registrar (loggear) automáticamente todas las llamadas entrantes y salientes.
///
public class LoggingInterceptor : Interceptor
{
private readonly ILogger _logger;
///
/// Inicializa una nueva instancia de la clase .
///
/// El servicio de registro de eventos inyectado por DI.
public LoggingInterceptor(ILogger logger)
{
_logger = logger;
}
///
/// Intercepta llamadas gRPC unarias (de un solo mensaje de ida y vuelta).
///
///
/// Lógica de ejecución: Serializa el objeto entrante a formato JSON y lo registra en los logs junto con el nombre del método gRPC invocado. Luego, delega el control al siguiente paso en el pipeline mediante . Una vez que el método real termina de procesarse, registra un mensaje confirmando que la respuesta ha sido enviada.
///
/// El mensaje de petición recibido del cliente.
/// El contexto de la llamada del servidor (headers, metadatos, estado).
/// El delegado que invoca el siguiente interceptor o el manejador real del servicio.
/// La respuesta generada por el manejador del servicio, que será devuelta al cliente.
public override async Task UnaryServerHandler(
TRequest request,
ServerCallContext context,
UnaryServerMethod continuation)
{
// Log del método y los parámetros del request en formato JSON
var requestJson = JsonSerializer.Serialize(request);
_logger.LogInformation("Received request for {Method} \nParameters:\n{Request}", context.Method, requestJson);
// Continuación del manejo del request
var response = await continuation(request, context);
// Log después de enviar la respuesta
_logger.LogInformation("Sent response for {Method}", context.Method);
return response;
}
}
}