Python - Logging (Italiano)

Ciao a tutti, aspiranti programmatori Python! Oggi entreremo nel meraviglioso mondo del logging in Python. Come vostra insegnante di computer amichevole, sono entusiasta di guidarvi in questo viaggio. Credetemi, alla fine di questo tutorial, sarò in grado di fare logging come un professionista!

Python - Logging

Logging in Python

Immagina di essere un detective che cerca di risolvere un mistero. Vuoi tenere traccia di tutte le prove che trovi, giusto? Ecco esattamente ciò che fa il logging nella programmazione! Ci aiuta a tenere traccia di ciò che sta accadendo nel nostro codice mentre viene eseguito.

Python dispone di un modulo integrato logging che rende questo processo un gioco da ragazzi. È come avere un taccuino fidato che annota automaticamente le informazioni importanti per voi.

Vantaggi del Logging

Ora, potresti chiederti: "Perché preoccuparmi del logging quando posso semplicemente usare delle istruzioni di stampa?" Ottima domanda! Lasciatemi condividere una piccola storia dei miei primi giorni di programmazione.

Una volta ho passato ore a debugare un programma usando istruzioni di stampa. Era come cercare un ago in un pagliaio! È stato allora che ho scoperto la magia del logging. Ecco alcuni vantaggi:

  1. Flessibilità: A differenza delle istruzioni di stampa, i log possono essere facilmente attivati o disattivati senza modificare il codice.
  2. Livelli di Severità: Puoi categorizzare i tuoi log in base alla loro importanza.
  3. Controllo dell'Output: I log possono essere diretti verso file, console o anche server remoti!
  4. Prestazioni: Il logging ha un impatto meno significativo sulle prestazioni rispetto alle istruzioni di stampa.

Componenti del Logging in Python

Analizziamo i componenti principali del logging in Python:

  1. Loggers: Sono i punti di ingresso nel sistema di logging.
  2. Handlers: Inviano i record di log al destinatario appropriato.
  3. Formatters: Specificano il layout dei record di log nell'output finale.
  4. Filters: Forniscono un controllo aggiuntivo su quali record di log devono essere output.

Pensa a questo come a una catena di montaggio in una fabbrica. Il logger è il lavoratore che individua i problemi, l'handler decide dove inviare la segnalazione, il formatter decide come dovrebbe apparire la segnalazione, e il filtro decide quali segnalazioni sono abbastanza importanti da trasmettere.

Livelli di Logging

Il logging in Python dispone di cinque livelli standard di severità. Guardiamo un comodo tabella:

Livello Valore numerico Descrizione
DEBUG 10 Informazioni dettagliate, tipicamente di interesse solo per la diagnosi dei problemi.
INFO 20 Conferma che le cose stanno funzionando come previsto.
WARNING 30 Indicazione che è successo qualcosa di inaspettato, o indicativo di un problema prossimo.
ERROR 40 A causa di un problema più grave, il software non è stato in grado di eseguire alcuna funzione.
CRITICAL 50 Un errore grave, indicante che il programma stesso potrebbe essere incapace di continuare a funzionare.

Esempio di Logging di Base

Iniziamo con un esempio semplice per iniziare:

import logging

# Configura il logging di base
logging.basicConfig(level=logging.INFO)

# Crea un logger
logger = logging.getLogger(__name__)

# Registra alcuni messaggi
logger.debug("Questo è un messaggio di debug")
logger.info("Questo è un messaggio di info")
logger.warning("Questo è un messaggio di avviso")
logger.error("Questo è un messaggio di errore")
logger.critical("Questo è un messaggio di critico")

Se esegui questo codice, vedrai un output simile a questo:

INFO:__main__:Questo è un messaggio di info
WARNING:__main__:Questo è un messaggio di avviso
ERROR:__main__:Questo è un messaggio di errore
CRITICAL:__main__:Questo è un messaggio di critico

Noti come il messaggio di DEBUG non appare? Questo perché abbiamo impostato il livello di configurazione di base su INFO. Qualsiasi cosa al di sotto di INFO (come DEBUG) non verrà registrata a meno che non modifichiamo la configurazione.

Configurazione del Logging

Ora, fate un po 'di più di configurazione del logging:

import logging

# Configura il logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='app.log'
)

logger = logging.getLogger(__name__)

logger.debug("Messaggio di debug")
logger.info("Messaggio di info")
logger.warning("Messaggio di avviso")
logger.error("Messaggio di errore")
logger.critical("Messaggio di critico")

In questo esempio, abbiamo:

  1. Impostato il livello di logging su DEBUG
  2. Specificato un formato per i nostri messaggi di log
  3. Indirizzato l'output a un file chiamato 'app.log'

Se controlli il file 'app.log', vedrai messaggi di log ben formati con timestamp!

Handler del Logging

Gli handler sono come il servizio postale del mondo del logging. Determinano dove finiscono i vostri messaggi di log. Guardiamo un esempio che utilizza più handler:

import logging

# Crea un logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# Crea handler
c_handler = logging.StreamHandler()  # Handler della console
f_handler = logging.FileHandler('file.log')  # Handler del file
c_handler.setLevel(logging.WARNING)
f_handler.setLevel(logging.ERROR)

# Crea formattatori e aggiungili agli handler
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)
f_handler.setFormatter(f_format)

# Aggiungi handler al logger
logger.addHandler(c_handler)
logger.addHandler(f_handler)

# Testa il logger
logger.debug('Questo è un messaggio di debug')
logger.info('Questo è un messaggio di info')
logger.warning('Questo è un messaggio di avviso')
logger.error('Questo è un messaggio di errore')
logger.critical('Questo è un messaggio di critico')

In questo esempio, abbiamo configurato due handler:

  1. Un StreamHandler che output WARNING e sopra alla console
  2. Un FileHandler che registra ERROR e sopra in un file

Esegui questo codice, e vedrai WARNING e sopra nella tua console, mentre solo ERROR e CRITICAL saranno salvati nel file.

E ce l'abbiamo fatta, ragazzi! Avete appena fatto i vostri primi passi nel mondo del logging in Python. Ricordate, la pratica fa l'artista. Prova a giocare con diverse configurazioni e vedi cosa funziona meglio per i tuoi progetti.

Buon logging, e che il tuo codice sia sempre privo di bug!

Credits: Image by storyset