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; } } }