Skip to content

Logging

Las aplicaciones Platform utilizan internamente la libreria Serilog para logging, la cual se integra perfectamente con la infraestructura que ofrece Net Core para esta tarea. En definitiva en nuestra aplicación siempre haremos uso de logging usando las interfaces genéricas de Net Core y nunca directamente a través de Serilog.

Como hacer uso del logging en un componente con DI (Dependency Injection)

Como todos los componentes dentro de una aplicación Net Core - Platform, el uso de logging es a través de la Inyección de dependencias en el constructor. En el caso de logging, nosotros no deberemos hacer nada para registrar estos componentes en el Startup de la aplicación ya que este trabajo lo realiza Platform al iniciar, lo que si deberemos hacer es agregar la interfaz ILogger<T> en el constructor del componente que quiera hacer uso de log. A continuación podremos ver un ejemplo:

using Microsoft.Extensions.Logging;

namespace PlatformConsoleTest
{
  public class MyComponent : IComponent
  {
    private readonly ILogger<MyComponent> _logger;   

    public MyComponent(ILogger<MyComponent> logger)
    {
      _logger = logger;
    }

    public void MethodUsingLog()
    {
      _logger.LogInformation("Logging something useful.");
    }
  }
}

Como hacer uso del logging en un componente sin DI (Dependency Injection)

En el caso excepcional, repito excepcional y lo remarco, de necesitar usar logging desde un componente que no se instancia por medio contenedor de IoC, Platform cuenta con una clase (Infra.Full.Logging.ApplicationLogging) que se puede utilizar como Factory para generar loggers. A continuacion podremos ver un ejemplo de su uso:

  public class ComponentWithoutIoC
  {
    private readonly ILogger<ComponentWithoutIoC> _logger;
    public ComponentWithoutIoC()
    {
      _logger = ApplicationLogging.CreateLogger<ComponentWithoutIoC>();
    }
    public void MethodUsingLog()
    {
      _logger.LogInformation("Logging something useful.");
    }
  }

Configuracion Infra.Full >= 2.1.6

Como se menciono anteriormente, para logging se utiliza la librería Serilog, por este motivo, todo lo referente a configuración es especifico de Serilog, el siguiente link nos puede servir como documentación. A continuación podemos observar la configuración por default que provee cada aplicación Platform. En esta version se actualizo el sink para la escritura de logs a archivo, se puede ver que anteriormente se utiliza el sink RollingFile y ahora desde la version 2.1.6 el sink utilizado es el File. En la configuración se puede observar que se generara archivos por dia, con un tamaño maximo de 10kbytes y que solo se mantendrán 2 archivos en total. Ajustar la configuración acorde a la aplicación y políticas de log.

  "Serilog": {
    "WriteTo": [
      {
        "Name": "Console"
      },
      {
        "Name": "File",
        "Args": {
          "path": "Logs/log.txt",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} | {ThreadId} | {Level:u4} | {AppDomain} | {SourceContext} | {Message:lj}{NewLine}{Exception}",
          "rollingInterval": "Day",
          "fileSizeLimitBytes": 10000,
          "rollOnFileSizeLimit": true,
          "retainedFileCountLimit": 2
        }
      }
    ],
    "Enrich": [ "FromLogContext", "WithThreadId" ]
  },

Configuración Infra.Full <= 2.1.5

Como se menciono anteriormente, para logging se utiliza la librería Serilog, por este motivo, todo lo referente a configuración es especifico de Serilog, el siguiente link nos puede servir como documentación. A continuación podemos observar la configuración por default que provee cada aplicación Platform.

{
  "Serilog": {
    "WriteTo": [
      {
        "Name": "Console"
      },
      {
        "Name": "RollingFile",
        "Args": {
          "pathFormat": "Logs/log-{Date}.txt",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} | {ThreadId} | {Level:u4} | {AppDomain} | {SourceContext} | {Message:lj}{NewLine}{Exception}"

        }
      }
    ],
    "Enrich": [ "FromLogContext", "WithThreadId" ]
  }
}
Esta configuración define dos tipos de output para el logging, una por consola y la otra por archivo de texto con el formato especifico para la integración de la misma con el Logging Centralizado que utiliza Andreani (ELK).