Graylog: Utilizar com Python

Como enviar logs de Python para o Graylog

👋 Bem-vindo à documentação da Stackhero!

A Stackhero oferece uma solução Graylog cloud pronta a usar que proporciona uma série de benefícios, incluindo:

  • Servidor de email SMTP ilimitado e dedicado incluído.
  • Atualizações sem esforço com apenas um clique.
  • Nome de domínio personalizável seguro com HTTPS (por exemplo, https://logs.sua-empresa.com).
  • Desempenho ótimo e segurança robusta alimentados por uma VM privada e dedicada.

Poupe tempo e simplifique a sua vida: são necessários apenas 5 minutos para experimentar a solução Graylog cloud hosting da Stackhero!

Enviar logs de Python para o Graylog é um processo simples. Neste guia, vamos mostrar como pode utilizar os pacotes graypy e logging para encaminhar logs da sua aplicação Python para a sua instância Graylog.

Primeiro, deve configurar uma entrada GELF TCP no seu servidor Graylog.

Aceda ao painel de administração do Graylog. Em "System" > "Inputs", pode criar uma nova entrada do tipo "GELF TCP". Certifique-se de selecionar a opção "global", introduza um "title" para a sua entrada e confirme que a porta está definida para 12201.

Não ative nenhuma opção de TLS aqui. A encriptação TLS será gerida pelo reverse proxy incluído na sua instância.

Configuração da entradaConfiguração da entrada

No dashboard da Stackhero, selecione o seu serviço Graylog e clique em "Configure".

Verifique que a porta TCP 12201 está corretamente configurada e que a "TLS encryption" está ativada para esta porta. Guarde as alterações para aplicar a configuração.

Configuração da porta de entradaConfiguração da porta de entrada

Deve verificar no "Firewall" do seu serviço se pelo menos o seu IP está autorizado a enviar dados para a porta TCP 12201. Para testes, pode ser mais simples permitir todas as IPs (0.0.0.0/0), que é a configuração por defeito.

Para este exemplo, pode utilizar a biblioteca graypy. Para começar, basta instalá-la com pip install graypy.

De seguida, crie um ficheiro chamado graylog-example.py e substitua <XXXXXX>.stackhero-network.com pelo hostname do seu servidor. Eis um exemplo de script que pode experimentar:

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 visualizar os seus logs, abra o painel de administração do Graylog, vá ao separador "Search", clique no ícone de play e defina a atualização para cada segundo. Pode executar o seu script com:

python graylog-example.py

Assim que o script for executado, a sua mensagem de log será enviada para o Graylog e deverá vê-la aparecer nos resultados da pesquisa.

Primeiro log recebido no GraylogPrimeiro log recebido no Graylog

Ao clicar na mensagem "This is a test from a Python script!", poderá ver detalhes úteis como o nome do script e a linha exata que gerou o log.

Detalhes do logDetalhes do log

O Graylog não serve apenas para mensagens de log normais. Também pode capturar e encaminhar erros para obter melhor visibilidade sobre o comportamento da sua aplicação. Isto facilita a monitorização e a receção de notificações sobre problemas por email, Slack ou Mattermost.

Aqui está um exemplo onde chamamos intencionalmente uma função que não existe para gerar um erro. Lembre-se de substituir "<XXXXXX>.stackhero-network.com" pelo hostname real da sua instância.

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)

Pode executar este script tal como anteriormente. No painel de administração do Graylog, verá a mensagem de erro "NameError: name 'unknown_function' is not defined" juntamente com o stack trace completo.

Exemplo de log de erroExemplo de log de erro

Embora os exemplos anteriores utilizem encriptação TLS, não fazem validação do certificado. Isto é aceitável para testes, mas em ambiente de produção, é importante verificar a validade do certificado.

Pode ativar a validação do certificado adicionando as opções validate e ca_certs desta forma:

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

Certifique-se de que o ficheiro /etc/ssl/certs/ca-certificates.crt existe no seu sistema:

  • Em Ubuntu/Debian, pode instalá-lo com sudo apt install ca-certificates.
  • Em Alpine Linux, instale com apk add ca-certificates.
  • Em macOS, já está instalado por defeito, mas o ficheiro chama-se /etc/ssl/cert.pem.

Se não estiver a ver os seus logs no Graylog, verifique os seguintes pontos:

  1. Confirme que o Graylog tem uma entrada GELF TCP a escutar na porta 12201 e que o TLS não está ativado nesta entrada.
  2. No dashboard da Stackhero, em "Configure", confirme que a porta 12201 está configurada como TCP e com TLS ativado em "Input ports".
  3. Verifique que as definições do firewall na Stackhero mostram a porta "12201/tcp" como "ACCEPT", idealmente na posição #1 com a origem definida para 0.0.0.0/0 para testes.
  4. No painel de administração do Graylog, em "Search", certifique-se de que está a visualizar logs da última hora e defina a vista para atualizar a cada segundo para apanhar novas mensagens assim que chegam.