Autor en Google+
Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET, ASP.NET Core, MVC, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

10 años online 🎂

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET, ASP.NET Core, MVC, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 29 de noviembre de 2016
ASP.NET CoreComo vimos hace algún tiempo, ASP.NET Core viene equipado de serie con una potente infraestructura de logging que ofrece una fórmula sencilla para registrar trazas de lo que va ocurriendo en nuestra aplicación en tiempo de ejecución.

A la hora de registrar las trazas es posible indicar uno de los niveles definidos en la enumeración LogLevel, cuyos miembros son Trace, Debug, Information, Warning, Error y Critical. Estos miembros definen jerárquicamente la "importancia" de los acontecimientos que registramos, de forma que luego podemos configurar los proveedores para que sólo muestren o persistan mensajes a partir de un nivel determinado.

Por ejemplo, fijaos en el siguiente código de una acción MVC, en la que estamos capturando las posibles excepciones que se produzcan para registrar una traza de nivel LogLevel.Trace, de forma que dispongamos de información técnica de calidad cuando esto ocurra:
public IActionResult SomethingImportant()
{
    try
    {
        // Hacer algo importante aquí
    }
    catch (Exception ex)
    {
        // Obtenemos información detallada del contexto del error...
        var user = _userServices.GetCurrentUserInfo();
        var tenant = _tenantServices.GetCurrentTenantInfo();
        var context = _contextServices.GetCurrentContextInfo();

        // La formateamos para poder enviarla al logger...
        var msg = FormatMessage(ex, user, tenant, context); 

        // Y finalmente registramos el detalle con nivel "Trace"
        _logger.LogTrace(msg);
    }
    return View();
}
Observad que en el código estamos llamando a métodos del modelo, que podrían ser costosos, para obtener información detallada sobre el contexto de la ejecución, como el usuario actual, el tenant u otros datos con objeto de registrarlos en la traza.

Sin embargo, puede haber ocasiones en las que nos interese hacer una serie de operaciones sólo si sabemos que un determinado nivel de logging está activo en alguno de los proveedores que hemos configurado en el arranque de la aplicación.

Por ejemplo, en el ejemplo anterior, si en la aplicación no existe ningún logger configurado para registrar trazas con un nivel LogLevel.Trace,  la llamada a LogTrace() no servirá absolutamente para nada y el coste de preparar la información detallada del contexto habrá sido en vano.

Para estos casos, el interfaz ILogger dispone del método IsEnabled(), mediante el cual podemos consultar si alguno de los loggers configurados en la aplicación está dispuesto a registrar los mensajes del nivel que le pasemos como parámetro. Así, el código anterior podríamos reescribirlo de la siguiente manera:
public IActionResult SomethingImportant()
{
    try
    {
        // Hacer algo importante aquí
    }
    catch (Exception ex)
    {
        if (_logger.IsEnabled(LogLevel.Trace))
        {
            // Obtenemos información detallada del contexto del error...
            var user = _userServices.GetCurrentUserInfo();
            var tenant = _tenantServices.GetCurrentTenantInfo();
            var context = _contextServices.GetCurrentContextInfo();

            // La formateamos para poder enviarla al logger...
            var msg = FormatMessage(ex, user, tenant, context); 

            // Y finalmente registramos el detalle con nivel "Trace"
            _logger.LogTrace(msg);
        }
        else
        {
            _logger.LogDebug($"Exception in SomethingImportant {ex.Message}");
        }
    }
    return View();
}
Como podéis ver, si es posible se registrará el mensaje detallado con nivel LogLevel.Trace, y en caso contrario se registraría un simple mensaje con nivel LogLevel.Debug para dejar constancia de que algo extraño ocurrió.

Publicado en Variable not found.

Estos contenidos se publican bajo una licencia de Creative Commons Licencia Reconocimiento-No comercial-Compartir bajo la misma licencia 3.0 España de Creative Commons

2 Comentarios:

Admirador dijo...

A explorar esta parte interesante:

información detallada del contexto del error...
var user = _userServices.GetCurrentUserInfo();
var tenant = _tenantServices.GetCurrentTenantInfo();
var context = _contextServices.GetCurrentContextInfo();


El contexto...

José M. Aguilar dijo...

Hola!

Bueno, me temo que hay poco que explorar ahí, al menos en lo relativo al código del post, pues esos servicios (_userServices, _tenantServices...) son ficticios. ;)

Es sólo un ejemplo para ilustrar un escenario en el que la obtención de la información de contexto pudiera resultar pesada, que es cuando vale la pena aplicar la técnica que mostramos para conocer el nivel de traza del logger.

Gracias por comentar!