Cómo gestionar logs en aplicaciones modernas con FluentBit

Claudia Márquez
Caleidos
Published in
3 min readNov 10, 2023

En este artículo, exploramos la importancia de tratar los logs como flujos de datos (streams) en lugar de archivos estáticos en el contexto de las aplicaciones modernas. Los logs desempeñan un papel fundamental al proporcionar visibilidad sobre el comportamiento de las aplicaciones, permitir la detección y resolución de problemas, y facilitar la monitorización eficiente.

Analizaremos cómo funcionan STDIN y STDOUT en Linux, especialmente en entornos de contenedores, y cómo Fluent Bit puede ser configurado para recopilar, transformar y enviar estos registros a destinos específicos, como Elasticsearch o AWS CloudWatch, para un análisis más efectivo.

Logs como streams

En aplicaciones modernas, se recomienda tratar a los logs como un stream de datos y no como archivos estáticos. Esto significa que los logs se generan de manera continua y se transmiten a un lugar central donde pueden ser recopilados, analizados y almacenados. En el contexto de contenedores, debemos hacer que nuestras aplicaciones envien los logs al STDOUT y al STDERR.

Para entender cómo se tratan los logs como streams, necesitamos comprender qué es el STDOUT y STDERR. En Linux, cada proceso tiene tres descriptores de archivo estándar: STDIN, STDOUT y STDERR. STDIN es la entrada estándar, desde donde un proceso lee su entrada. STDOUT es la salida estándar, donde un proceso escribe su salida. STDERR es la salida de error estándar, donde un proceso escribe sus mensajes de error.

En un entorno de contenedores, cada contenedor tiene su propio STDOUT y STDERR. Debemos codificar nuestra aplicación para que los logs generados sean enviados al STDOUT o al STDERR. Muchas veces esto puede ser logrado configurando el driver de logs que estemos utilizando en nuestro framework de desarrollo. En el caso que no podamos modificar la aplicación, una solución alternativa es realizar un symbolic link entre los archivos en los que se está guardando los logs hacia /dev/stdout o /dev/stderr. Esta técnica la podemos ver en el Docker oficial de nginx.

Al gestionar nuestros logs como un stream, podemos aprovechar diversas estrategias para la recopilación, transformación y enrutamiento de los mismos. Este enfoque libera a nuestras aplicaciones de la responsabilidad de determinar su destino final de almacenamiento, lo que contribuye significativamente a la separación de preocupaciones y fomenta el desarrollo de aplicaciones altamente modularizadas, en línea con la arquitectura basada en microservicios.

FluentBit y EKS

Fluentbit es un procesador y enrutador de logs. Esta herramienta nos permitirá tomar los logs generados por nuestros contenedores, transformarlos y llevarlos a su destino final.

En el contexto de EKS, la ubicación predeterminada para los registros de los contenedores es el directorio /var/log/containers. Los registros de cada contenedor se almacenan en un archivo separado con un nombre que incluye el ID del contenedor y una marca de tiempo.

Fluent Bit puede configurarse para leer registros de este directorio, enriquecerlos con metadata de kubernetes y llevarlos a diferentes destinos.

Instalación de Fluent Bit en EKS

En esta sección, detallaremos los pasos para la instalación y configuración de Fluent Bit en Amazon Elastic Kubernetes Service (EKS) mediante Helm.

Primero, debemos agregar el repositorio Helm de Fluent Bit:

helm repo add fluent https://fluent.github.io/helm-charts

Luego, podemos instalar Fluent Bit utilizando el siguiente comando:

helm upgrade - install fluent-bit fluent/fluent-bit

Este comando iniciará el proceso de instalación de Fluent Bit en el clúster de EKS. Sin embargo, es importante destacar que Helm permite personalizar la configuración mediante un archivo de valores personalizado. Esto es particularmente útil cuando se desean sobrescribir los valores predeterminados del chart de Fluent Bit para adaptarlos a necesidades específicas.

Una acción muy común es configurar hacia donde queremos enrutar el tráfico. Por ejemplo, podemos configurar el helm para enrutar los logs hacia un cluster de Opensearch dentro de AWS. Para eso crearemos un archivo values.yml que sobrescribirá el values.yml por defecto del chart de helm.

config:
outputs: |
[OUTPUT]
Name es
Match *
Host ${ES_ENDPOINT}
Port 443
TLS On
AWS_Auth On
AWS_Region ${AWS_REGION}
Retry_Limit 6

Una vez creado el archivo, ejecuta el siguiente comando asegurándote de especificar la ruta correcta al archivo values.yaml:

helm upgrade - install fluent-bit fluent/fluent-bit -f /ruta/al/values.yaml

Con esta configuración, Fluent Bit enrutará los registros de tus contenedores hacia el clúster de Amazon OpenSearch, lo que te permitirá aprovechar la potente capacidad de búsqueda y análisis de logs que ofrece AWS.

--

--