Graylog: Utilizzo con Python
Come inviare log da Python a Graylog
👋 Benvenuti nella documentazione di Stackhero!
Stackhero offre una soluzione Graylog cloud pronta all'uso che fornisce numerosi vantaggi, tra cui:
- Server email SMTP illimitato e dedicato incluso.
- Aggiornamenti senza sforzo con un solo clic.
- Nome di dominio personalizzabile sicuro con HTTPS (ad esempio, https://logs.tua-azienda.com).
- Prestazioni ottimali e sicurezza robusta grazie a una VM privata e dedicata.
Risparmia tempo e semplifica la tua vita: bastano 5 minuti per provare la soluzione Graylog cloud hosting di Stackhero!
Inviare log da Python a Graylog è un processo semplice. In questa guida vedremo come utilizzare i pacchetti graypy e logging per inoltrare i log dalla vostra applicazione Python alla vostra istanza Graylog.
Configurazione di Graylog
Per prima cosa, è necessario configurare un input GELF TCP sul vostro server Graylog.
Accedete al pannello di amministrazione di Graylog. In "System" > "Inputs", potete creare un nuovo input di tipo "GELF TCP". Assicuratevi di selezionare la casella "global", inserire un "title" per il vostro input e verificare che la porta sia impostata su 12201.
Non attivate nessuna opzione TLS qui. La cifratura TLS sarà gestita dal reverse proxy incluso con la vostra istanza.
Configurazione dell'input
Configurazione del servizio in Stackhero
Nel pannello di controllo Stackhero, selezionate il vostro servizio Graylog e cliccate su "Configura".
Verificate che la porta TCP 12201 sia configurata correttamente e che la "Cifratura TLS" sia abilitata per questa porta. Salvate le modifiche per applicare la configurazione.
Configurazione della porta di input
Controllate nel "Firewall" del vostro servizio di aver autorizzato almeno il vostro IP a inviare dati verso la porta TCP 12201. Per i test, può essere più semplice autorizzare tutti gli IP (0.0.0.0/0), che è l'impostazione predefinita.
Esempio: Invio di log da Python
Per questo esempio potete utilizzare la libreria graypy. Per iniziare, installatela semplicemente con pip install graypy.
Successivamente, create un file chiamato graylog-example.py e sostituite <XXXXXX>.stackhero-network.com con il nome host del vostro server. Ecco uno script di esempio che potete provare:
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!')
Per visualizzare i vostri log, aprite il pannello di amministrazione Graylog, andate nella scheda "Search", cliccate sull'icona play e impostate l'aggiornamento ogni secondo. Potete eseguire lo script con:
python graylog-example.py
Una volta eseguito lo script, il vostro messaggio di log verrà inviato a Graylog e dovreste vederlo apparire nei risultati di ricerca.
Il vostro primo log ricevuto su Graylog
Cliccando sul messaggio "This is a test from a Python script!" potrete visualizzare dettagli utili come il nome dello script e la riga esatta che ha generato il log.
Dettaglio del log
Invio di log di errore
Graylog non serve solo per i messaggi di log standard. Potete anche intercettare e inoltrare errori per avere maggiore visibilità sul comportamento della vostra applicazione. Questo rende più semplice monitorare e ricevere notifiche di problemi tramite email, Slack o Mattermost.
Ecco un esempio in cui chiamiamo volutamente una funzione inesistente per generare un errore. Ricordate di sostituire "<XXXXXX>.stackhero-network.com" con il nome host effettivo della vostra istanza.
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)
Potete eseguire questo script come in precedenza. Nel pannello di amministrazione Graylog vedrete il messaggio di errore "NameError: name 'unknown_function' is not defined" insieme all'intera stack trace.
Esempio di log di errore
Rafforzare la sicurezza della comunicazione
Sebbene gli esempi precedenti utilizzino la cifratura TLS, non viene effettuata la validazione del certificato. Questo va bene per i test, ma in ambiente di produzione è importante verificare la validità del certificato.
Potete abilitare la validazione del certificato aggiungendo le opzioni validate e ca_certs come segue:
handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201, validate=True, ca_certs='/etc/ssl/certs/ca-certificates.crt')
Assicuratevi che il file /etc/ssl/certs/ca-certificates.crt sia presente sul vostro sistema:
- Su Ubuntu/Debian, potete installarlo con
sudo apt install ca-certificates. - Su Alpine Linux, installatelo con
apk add ca-certificates. - Su macOS, è installato di default, ma il file si chiama
/etc/ssl/cert.pem.
Risoluzione dei problemi
Se non vedete comparire i vostri log in Graylog, ecco alcuni controlli da effettuare:
- Assicuratevi che Graylog abbia un input GELF TCP in ascolto sulla porta 12201 e che TLS non sia abilitato su questo input.
- Nel pannello Stackhero, sotto "Configura", verificate che la porta 12201 sia configurata come TCP e che TLS sia abilitato nella sezione "Input ports".
- Controllate che le impostazioni del firewall in Stackhero mostrino la porta "12201/tcp" come "ACCEPT", idealmente in prima posizione con sorgente 0.0.0.0/0 per i test.
- Nel pannello di amministrazione Graylog, sotto "Search", assicuratevi di visualizzare i log dell'ultima ora e impostate la vista per aggiornarsi ogni secondo così da intercettare i nuovi messaggi appena arrivano.