Graylog: Uso con Python

Cómo enviar registros 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 registros desde Python a Graylog es sencillo. En este ejemplo, utilizaremos los paquetes graypy y logging para lograrlo.

En el lado de Graylog, necesita crear una entrada GELF TCP.

Vaya a su panel de administración de Graylog, luego en "System"/"Inputs" y cree una nueva entrada "GELF TCP". Marque la casilla "global", añada un "title" y asegúrese de que el puerto esté configurado en 12201.

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

Configuración de entradaConfiguración de entrada

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

Asegúrese de que el puerto TCP 12201 esté correctamente definido y active el "cifrado TLS" para él, luego valide su configuración.

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

Debería verificar en el "Firewall" de su servicio que ha permitido al menos su IP para enviar datos al puerto TCP 12201. Para propósitos de prueba, podría ser más fácil permitir todas las IPs (0.0.0.0/0), que es la configuración predeterminada.

Para este ejemplo, utilizaremos la biblioteca graypy. Puede instalarla simplemente con pip install graypy.

Luego, puede escribir el siguiente código en un archivo llamado graylog-example.py y reemplazar XXXXX.stackhero-network.com con el nombre de host de su servidor:

import logging
import graypy

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

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

my_logger.debug('¡Esto es una prueba desde un script de Python!')

Vaya a su panel de administración de Graylog, haga clic en la pestaña "Search", haga clic en el icono de reproducción y seleccione "Update every 1 second". Luego, puede ejecutar el script con esta línea de comando: python graylog-example.py.

El script enviará el registro a Graylog, ¡y debería verlo en su página de búsqueda de Graylog!

Su primer registro recibido en GraylogSu primer registro recibido en Graylog

Haga clic en la frase "¡Esto es una prueba desde un script de Python!" y verá información útil como el nombre del script, la línea que crea el registro, etc.

Registro detalladoRegistro detallado

Una característica útil es capturar errores y enviarlos a Graylog, para tener una visión global de los errores desencadenados por su aplicación. Incluso tendrá la capacidad de enviar notificaciones sobre dichos errores por correo electrónico, o utilizando Slack o Mattermost.

En este ejemplo, intentamos llamar a la función unknown_function, que no existe. No olvide reemplazar el valor "XXXXX.stackhero-network.com" con 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('XXXXX.stackhero-network.com', 12201)
my_logger.addHandler(handler)

try:
  unknown_function()
except NameError:
  my_logger.debug('La función "unknown_function" generó un error', exc_info=1)

Ejecute el script y regrese a su panel de administración de Graylog. Verá el error "NameError: name 'unknown_function' is not defined" y la traza completa del error.

Ejemplo de registro de errorEjemplo de registro de error

En los ejemplos anteriores, utilizamos TLS para cifrar la comunicación pero no verificamos la validez del certificado. Esto fue con fines de demostración, pero para producción, debería verificar la validez del certificado.

Puede hacerlo simplemente añadiendo las opciones validate y ca_certs así:

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

Debería asegurarse de que el archivo /etc/ssl/certs/ca-certificates.crt exista:

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

Si no recibe registros en su Graylog, podría querer verificar estos puntos:

  1. Graylog debería tener una entrada definida de tipo "GELF TCP", escuchando en el puerto 12201, sin ninguna configuración TLS definida.
  2. La configuración de Graylog en el panel de Stackhero (botón "Configurar") debería tener el puerto 12201 definido, con TCP y TLS activados en "Input ports".
  3. El firewall en el panel de Stackhero debería mostrarle el puerto "12201/tcp" como "ACCEPT", idealmente en la posición #1 con la fuente 0.0.0.0/0 definida (para pruebas).
  4. Debería vigilar los registros en el panel de administración de su Graylog en "Search". Para asegurarse de ver sus registros, seleccione "Search in the last 1 hour", haga clic en el icono de reproducción y seleccione "Update every 1 second".