Como agregar logs a un app de consola de Net Core

Adding logs to a Console App

Los logs son una parte importante de toda aplicación; nos permiten encontrar información de errores y advertencias , guardar información durante sesiones de debug. Este artículo muestra que nos brinda Net Core para los log por defecto y como podemos agregar otras funciones agregando librerias de terceros.

Como punto de partida vamos a usar la aplicación de consola del artículo anterior, el app fue creada usando la plantilla de "Worker Service" que viene por defecto con el SDK de .NET. La plantilla nos dara el codigo que se muestra a continuación

por defecto, la llamada al metodo Host.CreateDefaultBuilder() va ha agregar los siguientes proveedores de logs a nuestra aplicación:

  • Console: Escribe los logs en consola. Estos logs no son guardados, es decir no son persistentes.
  • Debug: Escribe los logs en la ventana de debug.
  • EventSource: Envia los logs a un componente multi plataforma, event source. Para poder acceder a estos logs podemos usar una herramiente como dotnet-trace.
  • EventLog: Envia los logs a un componente de Windows llamado "Windows Event Log". Puedes acceder esta información usando el Windows Event Viewer.

Net Core tiene diferentes niveles para el logging, el nivel puede ser configurado y a mayor nivel, menor cantidad de registros veremos en el log. Los niveles de log que tenemos son:
Trace(0) < Debug(1) < Information(2) < Warning(3) < Error(4) < Critical(5) < None(6)

Por defecto, el nivel de prioridad de los log en appsettings.json y appsettings.development.json es "Information". A continuación vamos hacer un pequeño experimento, vamos a cambiar el nivel a Trace para la sección "Default" y a None para la sección "Microsoft.Hosting.Lifetime". Luego agregaremos algunas lineas de codigo para escribir en todos los niveles de log que tenemos disponibles.

Microsoft logging levels code

Deberíamos ver los siguientes resultados en los log de consola:

Microsoft logging levels

Y en el caso del Windows Event Viewer solo deberiamos ver advertencias (wargnings) y errores (errors). Esto se debe a que por defecto el nivel de de este proveedor de logs es Warning.

Logs in Event Viewer

El Event Viewer de Windows muestra dos errores, esto se debe a que registramos uno de ellos como Error y el otro como Critical.

Como podrán haber notado, Microsoft no incluye un proveedor de logs que escriba en archivos. Si requieres registrar los logs en archivos necesitaras de un libreria adicional. Hay muchas opcinoes hoy en día, algunas de ellas son Log4Net, SeriLog, NLog, Sentry, entre otras. A continuación vamos a configurar y revisar un par de ellas.

Agregando Log4Net

Instalando Log4Net

Installs last version of Log4Net package

dotnet add src/WorkerService package log4net --version 2.0.14
Install Log4Net extensions

Install Log4Net extensions, this is a package created by the community outside of the official Log4Net packages that will allow us to wire up logging to the Host object and provide a bridge between Microsoft logging and Log4Net.

dotnet add src/WorkerService package microsoft.extensions.logging.log4net.aspnetcore

Además de las librerias agregadas, debemos hacer algunos cambios en el código. Basicamente necesitamos agregar Log4Net a la clase Program y agregar un archivo de configuacion para los log.

Los niveles de log soportados por Log4Net son ALL > INFO > WARN > ERROR > FATAL > OFF.
El paquete de extensiones se encarga de traductir los niveles de log de Log4Net a Microsoft

The advantage of using the Log4Net extensions is that we can capture all the built-int NET Core messages such as: "Hosting Starting", "Hosting Started", "Host Stoppping", "Host stopped". The reason of this is that NET Core will only write its internal messages to the ILoggerFactory instance that is created when the application starts. La ventaja de utilizar Log4Net extensions es que podemos capturar errores incorporados en Net Core.