martes, 29 de noviembre de 2016
Como 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
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
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
Para estos casos, el interfaz
Publicado en Variable not found.
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.
2 Comentarios:
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...
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!
Enviar un nuevo comentario