9 mejores prácticas de logging basadas en la experiencia
Logging o no Logging ya no es la cuestión, sino cómo y qué registrar se ha convertido en el área de enfoque para las operaciones de TI que buscan mejorar constantemente el rendimiento de la aplicación. Hemos recopilado algunas prácticas recomendadas que le ayudarán a «hacer logging de manera más inteligente» y a ahorrarle tiempo y recursos invaluables al rastrear un problema.
# 1 CONOZCA SUS AUDIENCIAS
Cuando se trata de registros, lo primero que hay que entender es que los registros de su aplicación tienen dos audiencias muy diferentes: humanos y máquinas.
Las máquinas son buenas para procesar grandes cantidades de datos estructurados de forma rápida y automática.
Los humanos, por otro lado, no son tan buenos para procesar grandes cantidades de datos, y nos lleva tiempo leer los registros. Por otro lado, los humanos manejan bien los datos no estructurados.
Para aprovechar al máximo sus registros, debe hacer que sus registros sean legibles para humanos y estructurados para máquinas.
# 2 TENER UNA ESTRUCTURA CONSISTENTE EN TODOS LOS REGISTROS
Un requisito previo para un buen logging es tener una estructura estándar de su archivo de registro, que sea coherente en todos los archivos de registro.
Cada línea de registro debe representar un evento único y contener al menos la marca de tiempo, el nombre de host, el servicio y el nombre del registrador.Los valores adicionales pueden ser el hilo o la identificación del proceso, la identificación del evento, la sesión y la identificación del usuario.
Otros valores importantes pueden estar relacionados con el entorno, como: ID de instancia, nombre de implementación, versión de la aplicación o cualquier otro par clave-valor relacionado con el evento.
Use una marca de tiempo de alta precisión (en resolución de milisegundos, si no mejor) y asegúrese de que su formato de marca de tiempo incluya datos de zona horaria. A menos que tenga una razón excepcionalmente buena, use ISO 8601.
Finalmente, si te sientes como un verdadero profesional, agrega una identificación única a cada línea de registro. Una línea de registro generalmente tendrá una parte fija y otra variable, lo que hace que sea difícil filtrar patrones específicos dentro o fuera (aunque a todos nos encantan las expresiones regulares). Aquí es donde la identificación única se vuelve útil.
Al registrar errores, agregue una ID de error. Esto será muy útil para buscar en sus sistemas de gestión del conocimiento (que por supuesto tiene).
Estos son importantes para rastrear o correlacionar problemas en diferentes componentes y en toda su arquitectura.
# 3 ENTENDER LA METRICA
Un concepto central en el registro es la métrica.
Una métrica es un valor específico de una propiedad en un tiempo específico, generalmente medido a intervalos regulares.
Los tipos de indicadores comunes son:
Medidor: mide la tasa de eventos (por ejemplo, la tasa de visitantes a su sitio web)
Temporizador: mide el tiempo que lleva algún procedimiento (por ejemplo, el tiempo de respuesta del servidor web)
Contador: aumenta y disminuye un valor entero (por ejemplo, número de usuarios registrados)
Indicador: mide un valor arbitrario (por ejemplo, CPU)
Cada métrica describe un estado de alguna propiedad del sistema.
Lo bueno de las métricas es tener muchas y poder correlacionar diferentes métricas juntas. Por ejemplo, si descubrimos que cada vez que los usuarios de nuestras aplicaciones utilizan el método «Obtener foto de gato» y el «Tiempo invertido en la página web» aumenta, podemos inferir que nuestros usuarios prefieren fotos de gato a otras fotos.
Le recomendamos que rastree y registre métricas, o alternativamente almacene métricas por separado de sus registros.
# 4 NOTIFICACIÓN DE ALERTAS Y MANEJO DE EXCEPCIONES
Si algo sucede dentro de su código, y ya sabe con certeza lo que sucedió y tal vez lo que debe hacerse, no loguee información y active una alarma para ese registro específico, ya que es complejo y propenso a errores. En su lugar, active únicamente la alerta directamente desde el código.
Además, al registrar una excepción, aunque el seguimiento de la pila es útil, es difícil de leer. Utilice bibliotecas como Apache ExceptionUtils para resumir el seguimiento de la pila y facilitar su consumo.
# 5 USE NIVELES DE GRAVEDAD DE REGISTRO
Diferentes eventos tienen diferentes implicaciones de gravedad. Esto es importante porque le permite diferenciar eventos graves e importantes de eventos irregulares o incluso regulares.
No descarte los problemas de menor gravedad, pueden usarse como puntos de datos cuando intente crear una línea base para el comportamiento de la aplicación.
Sus archivos de registro deben contener principalmente mensajes de depuración, información y advertencia, y muy pocos mensajes de error.
# 6 SIEMPRE PROPORCIONE CONTEXTO
Los desarrolladores escriben registros en línea con el código. Esto significa que al escribir los registros en el código, los desarrolladores basan el registro en el contexto del código. Desafortunadamente, la persona que lee el registro no tiene ese contexto y, a veces, ni siquiera tiene acceso al código fuente.
Por ejemplo, comparemos las siguientes dos líneas de registro:
«La base de datos no responde»
“Error al obtener las preferencias de los usuarios para la identificación de usuario = 1. La base de datos de configuración no responde. Volverá a intentarlo en 5 minutos «.
Al leer la segunda línea de registro, entendemos fácilmente qué intentaba hacer la aplicación, qué componente falló y si hay algún tipo de solución para este problema.
Cada línea de registro debe contener suficiente información para que sea fácil entender exactamente qué estaba pasando y cuál era el estado de la aplicación durante ese tiempo.
# 7 ELIJA UN BUEN FRAMEWORK DE REGISTRO Y USE SUS CARACTERÍSTICAS AVANZADAS
Abstenerse de intentar rodar su propio framework de registro. Hay muchas bibliotecas de registro excelentes para cada lenguaje de programación. Bueno, tal vez a excepción de TrumpScript.
Los framework de registro le permiten configurar diferentes apéndices, cada uno con sus formatos de salida y su patrón de registro personalizado.
Otras características estándar incluyen agregar automáticamente el nombre del logger y una marca de tiempo, soporte para múltiples niveles de gravedad y filtrado por estos niveles.
Los framework de registro también tienen las siguientes características avanzadas que debería usar:
Configure diferentes umbrales de nivel de registro para diferentes componentes en su código
Use un apéndice con pérdida que elimine los eventos de nivel inferior si las colas se llenan
Utilice un apéndice de resumen de registros que registrará: «el siguiente mensaje se repite X veces: [mensaje]» en lugar de repetirlo X veces
Coloque un umbral en el nivel de registro y configúrelo para que también muestre N líneas de registro de nivel inferior cuando se produzca el registro de mayor gravedad
# 8 ESCRIBIR REGISTROS ESTRUCTURADOS (A VECES)
Hacer que sus logger escriban registros estructurados puede generar algún impacto en el rendimiento, pero si puede tomarlo, vale la pena. Más adelante, será mucho más fácil cargar sus registros en herramientas de análisis o procesarlas con intermediarios de loggers.
# 9 REGISTRE MUCHO Y LUEGO REGISTRE MÁS
A menudo descuidamos escribir registros importantes o incluso no registrar intencionalmente para mantener sus registros compactos. La mayoría de las veces, perderá más tiempo como resultado de no tener la respuesta en sus registros, entonces habría gastado tiempo en escribir registros. La calidad de sus registros es parte de la calidad de su código.
Utilice soluciones de registro centralizadas, sistemas automáticos de procesamiento de registros y aplique las técnicas descritas anteriormente para mantener los registros útiles, solo siga registrando.