Graylog: Uso con Python

Cómo enviar logs desde Python a Graylog

👋 ¡Bienvenido a la documentación de Stackhero!

Stackhero ofrece una solución Graylog cloud lista para usar que proporciona una serie de beneficios, incluyendo:

  • Servidor de correo electrónico SMTP ilimitado y dedicado incluido.
  • Actualizaciones sin esfuerzo con solo un clic.
  • Nombre de dominio personalizable asegurado con HTTPS (por ejemplo, https://logs.tu-empresa.com).
  • Rendimiento óptimo y seguridad robusta gracias a una VM privada y dedicada.

Ahorra tiempo y simplifica tu vida: ¡solo toma 5 minutos probar la solución de Graylog cloud hosting de Stackhero!

Enviar logs desde Python a Graylog es un proceso sencillo. En esta guía, le mostraremos cómo utilizar los paquetes graypy y logging para enviar logs desde su aplicación Python a su instancia de Graylog.

En primer lugar, debe configurar una entrada GELF TCP en su servidor Graylog.

Acceda al panel de administración de Graylog. En "System" > "Inputs", puede crear una nueva entrada de tipo "GELF TCP". Asegúrese de marcar la casilla "global", introducir un "title" para su entrada y comprobar que el puerto está configurado en 12201.

No active ninguna opción de TLS aquí. El cifrado TLS será gestionado por el proxy inverso incluido con su instancia.

Configuración de la entradaConfiguración de la entrada

En el panel de Stackhero, seleccione su servicio Graylog y haga clic en "Configurar".

Verifique que el puerto TCP 12201 esté correctamente configurado y que el "cifrado TLS" esté habilitado para este puerto. Guarde los cambios para aplicar la configuración.

Configuración del puerto de entradaConfiguración del puerto de entrada

Debe comprobar en el "Firewall" de su servicio que al menos su IP tenga permiso para enviar datos al puerto TCP 12201. Para pruebas, puede ser más sencillo permitir todas las IPs (0.0.0.0/0), que es la configuración predeterminada.

Para este ejemplo, puede utilizar la librería graypy. Para empezar, simplemente instálela con pip install graypy.

A continuación, cree un archivo llamado graylog-example.py y sustituya <XXXXXX>.stackhero-network.com por el nombre de host de su servidor. Aquí tiene un script de ejemplo que puede probar:

import logging
import graypy

my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)

handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201)
my_logger.addHandler(handler)

my_logger.debug('This is a test from a Python script!')

Para ver sus logs, abra el panel de administración de Graylog, vaya a la pestaña "Search", haga clic en el icono de reproducción y configúrelo para que se actualice cada segundo. Puede ejecutar su script con:

python graylog-example.py

Una vez que el script se ejecute, su mensaje de log se enviará a Graylog y debería verlo aparecer en los resultados de búsqueda.

Primer log recibido en GraylogPrimer log recibido en Graylog

Al hacer clic en el mensaje "This is a test from a Python script!" podrá ver detalles útiles como el nombre del script y la línea exacta que generó el log.

Detalle del logDetalle del log

Graylog no solo sirve para mensajes de log habituales. También puede capturar y reenviar errores para tener una mejor visibilidad del comportamiento de su aplicación. Esto facilita la monitorización y la recepción de notificaciones sobre incidencias por email, Slack o Mattermost.

Aquí tiene un ejemplo en el que llamamos intencionadamente a una función que no existe para generar un error. Recuerde sustituir "<XXXXXX>.stackhero-network.com" por el nombre de host de su instancia.

import logging
import graypy

my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)

handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201)
my_logger.addHandler(handler)

try:
    unknown_function()
except NameError:
    my_logger.debug('The "unknown_function" raised an error', exc_info=1)

Puede ejecutar este script igual que antes. En el panel de administración de Graylog, verá el mensaje de error "NameError: name 'unknown_function' is not defined" junto con el stack trace completo.

Ejemplo de log de errorEjemplo de log de error

Aunque los ejemplos anteriores utilizan cifrado TLS, no realizan validación del certificado. Esto es aceptable para pruebas, pero en un entorno de producción, es importante verificar la validez del certificado.

Puede habilitar la validación del certificado añadiendo las opciones validate y ca_certs de la siguiente manera:

handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201, validate=True, ca_certs='/etc/ssl/certs/ca-certificates.crt')

Asegúrese de que el archivo /etc/ssl/certs/ca-certificates.crt existe en su sistema:

  • En Ubuntu/Debian, puede instalarlo con sudo apt install ca-certificates.
  • En Alpine Linux, instálelo con apk add ca-certificates.
  • En macOS, viene instalado por defecto, pero el archivo se llama /etc/ssl/cert.pem.

Si no ve sus logs en Graylog, aquí tiene algunos puntos que puede comprobar:

  1. Asegúrese de que Graylog tiene una entrada GELF TCP escuchando en el puerto 12201 y que TLS no está habilitado en esa entrada.
  2. En el panel de Stackhero, en "Configurar", confirme que el puerto 12201 está configurado con TCP y TLS habilitado en "Input ports".
  3. Verifique que la configuración del firewall en Stackhero muestra el puerto "12201/tcp" como "ACCEPT", idealmente en la posición #1 y con el origen configurado en 0.0.0.0/0 para pruebas.
  4. En el panel de administración de Graylog, en "Search", asegúrese de estar viendo los logs de la última hora y configure la vista para que se actualice cada segundo y así ver los nuevos mensajes en cuanto lleguen.