Guías ASP.NET Core

Descripción

En esta guía veremos como registrar logs en archivos txt, de forma manual.

Existen herramientas de logging para .NET, como NLog o Serilog, pero no se abordarán en este documento, al menos por ahora.

Requisitos previos
  • Contar con un proyecto ASP.NET Core Web API existente.
  • Tener instalado el paquete Newtonsoft.Json o alguno equivalente.
Definir métodos para crear logs

Dentro de un directorio destinado a métodos auxiliares (si no existe, creamos el directorio Helpers en la raíz del proyecto) agregamos una clase estática llamada LogMessages.

En esta clase que acabamos de crear, definiremos los métodos necesarios para registrar diferentes tipos de logs.

A modo de ejemplo, definiremos los siguienter dos métodos:
  1. Uno va a ser para registrar las excepciones capturadas en los bloques try-catch, para poder hacer un seguimiento de errores del servicio.
  2. Y el otro será para grabar la mensajería entre los clientes y la API. Es decir, el input enviado por el usuario al realizar la solicitud y la respuesta devuelta por la API.

Logging de errores

Creamos un método estático void, que recibe como parámetros:

  • Nombre del método donde se capturó la exceptión. String
  • Nombre del archivo al que pertenece el método (en este caso es un método de repositorio). String
  • Excepción capturada. Exception

Definición del método: using Newtonsoft.Json; using System.Text.RegularExpressions; namespace MiApiNetCore.Helpers {   public static class LogMessages   {     public static void GrabarLogError(string metodo, string repositorio, Exception exception)     {       try       {         string innerEx = "";         // Busco inner exception:         if (exception.InnerException != null)         {           innerEx = $" - {exception.InnerException.Message}";         }         //Busco la posición del error:         string posicionError;         Match match = Regex.Match(exception.StackTrace, @"line (\d+)");         if (match.Success)         {           posicionError = match.Groups[0].Value;         }         else         {           posicionError = "-";         }         //Seteo el nombre y la ubicación del archivo:         var fecha = DateTime.UtcNow;         var fecha1 = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, (TimeZoneInfo.FindSystemTimeZoneById("Argentina Standard Time")));         string fileName = $"errores{fecha.Year}-{fecha.Month}-{fecha.Day}.txt";         string path = "C:\\MiApiNetCore";         //Grabo el contenido en el archivo de logs:         if (!String.IsNullOrEmpty(path))         {           if (!Directory.Exists(path))           {             DirectoryInfo di = Directory.CreateDirectory(path);           }           if (path.Substring(path.Length - 1, 1) != "\\")           {             path += "\\";           }           string txtFile = path + fileName;           string[] lineas = {$"FECHA: {fecha1}",                  $"REPOSITORIO: {repositorio}",                  $"MÉTODO: {metodo}",                  $"ERROR: {exception.Message} {innerEx}",                  $"POSICIÓN: {posicionError}",                  "------------------------------------------------"};           File.AppendAllLines(txtFile, lineas);         }       }       catch (Exception ex)       {         return;       }     }   } }

Logging de solicitud y respuesta

Creamos un método estático void, que recibe como parámetros:

  • Nombre del método HTTP. String
  • Nombre del archivo al que pertenece el método (en este caso es un controlador). String
  • Input de la solicitud. Object
  • Respuesta de la solicitud. Object

Definición del método: using Newtonsoft.Json; using System.Text.RegularExpressions; namespace MiApiNetCore.Helpers {   public static class LogMessages   {     public static void GrabarLogSolicitud(string metodo, string controlador, object solicitud, object respuesta)     {       try       {       // Convierto los objetos de solicitud y respuesta en String con formato JSON:         string jsonSolicitud = JsonConvert.SerializeObject(solicitud);         string jsonRespuesta = JsonConvert.SerializeObject(respuesta);         var fecha = DateTime.UtcNow;         var fecha1 = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, (TimeZoneInfo.FindSystemTimeZoneById("Argentina Standard Time")));       // Defino el nombre del archivo txt donde voy a grardar los logs de errores:         string fileName = $"solicitudes{fecha.Year}-{fecha.Month}-{fecha.Day}.txt";       // Establezco la ruta del archivo txt:         string path = "C:\\MiApiNetCore";         if (!String.IsNullOrEmpty(path))         {         // Si aún no existe, creo el directorio:           if (!Directory.Exists(path))           {             DirectoryInfo di = Directory.CreateDirectory(path);           }           // Establezco la ruta completa del archivo:           if (path.Substring(path.Length - 1, 1) != "\\")           {             path += "\\";           }           string txtFile = path + fileName;           // Defino el contenido del log:           string[] lineas = {$"FECHA: {fecha1}",                  $"CONTROLADOR: {controlador}",                  $"MÉTODO: {metodo}",                  $"SOLICITUD: {jsonSolicitud}",                  $"RESPUESTA: {jsonRespuesta}",                  "------------------------------------------------"};           // Grabo el contenido del log en el archivo txtFile:           File.AppendAllLines(txtFile, lineas);         }       }       catch (Exception ex)       {         return;       }     }   } }
Invocar a los métodos para grabar logs

En construcción...