Post Image

Livelli di Log in Python: Tutto Quello che Devi Sapere per un Logging Efficace

Il logging è una componente cruciale nello sviluppo software, in particolare quando si tratta di monitorare e diagnosticare problemi nelle applicazioni. In Python, il modulo logging offre una struttura flessibile e potente per gestire i log. Nell'articolo Guida Completa al Logging in Python dalla Configurazione di Base alla Configurazione Avanzata ti abbiamo mostrato come configurare i logger in modo automatico o manuale, sottolineando i pregi e i difetti di ciascuna scelta.

Questo articolo affronta in dettaglio il tema dei livelli di log. In particolare vedrai quali sono i livelli di log, come creare livelli di `log' personalizzati, le best practice di utilizzo, la gestione delle eccezioni e come disabilitare il logging quando necessario.

Livelli di Log

Il modulo logging in Python definisce sei livelli di log principali, ognuno dei quali rappresenta una severità diversa.

DEBUG (10)

Il livello di DEBUG offre dei dettagli diagnostici molto dettagliati. Questo livello è utile durante lo sviluppo per diagnosticare problemi.

Questo livello si usa per avere informazioni approfondite e di interesse solo quando si diagnostica un problema.

logging.debug("Dettagli diagnostici di basso livello")

INFO (20)

Il livello INFO conferma che le cose stanno funzionando come previsto.

Il livello è utilizzato per fornire messaggi di routine che confermano che tutto funziona correttamente. I messaggi sono utili per capire se l'esecuzione delle applicazioni sta procedendo correttamente.

logging.info("Il servizio è stato avviato correttamente")

WARNING (30)

Il livello WARNING da indicazione che qualcosa di inatteso è accaduto o potrebbe accadere in futuro (ad esempio, 'spazio su disco basso'). Il software funziona ancora come previsto.

Il livello mostra tutte quelle anomalie, che, non sono errori, ma potrebbero richiedere attenzione.

logging.warning("Lo spazio su disco è quasi esaurito")

ERROR (40)

Il livello di ERROR mostra i problemi seri, a fronte dei quali il software non è stato in grado di eseguire una funzione.

Il livello mostra tutti gli errori che potrebbero impedire il corretto funzionamento dell'applicazione.

logging.error("Impossibile connettersi al database")

CRITICAL (50)

Il livello CRITICAL mostra errori molto gravi che potrebbero pregiudicare il corretto funzionamento del programma. Il programma potrebbe non essere in grado di continuare l'esecuzione.

Il livello si utilizza per errori che potrebbero causare la chiusura dell'applicazione.

logging.critical("Errore critico: il sistema sta per chiudersi")

NOTSET (0)

Il livello predefinito per i logger che non hanno un livello esplicitamente impostato.

Il livello è utilizzato quando si vuole che un logger erediti il livello impostato per il logger padre.

Livello di Log Personalizzato

Nel precedente paragrafo hai visto i livelli di Log forniti da Python. In alcune situazioni potrebbe essere utile definire altri livelli di Log personalizzati.

Supponi, ad esempio, che in produzione il livello dei log è impostato su WARNING ma tu voglia lo stesso mostrare alcuni messaggi di INFO: come puoi gestire questa situazione? Nel caso specifico, potresti definire un livello di NOTICE, posto sopra WARNING, che si occupi di mostrare quei messaggi di INFO molto importanti.

Per creare il livello di NOTICE, scrivi il seguente codice:

import logging

NOTICE_LEVEL = 35
logging.addLevelName(NOTICE_LEVEL, "NOTICE")

def notice(self, message, *args, **kws):
    if self.isEnabledFor(NOTICE_LEVEL):
        self._log(NOTICE_LEVEL, message, args, **kws)

logging.Logger.notice = notice

logger = logging.getLogger(__name__)
logger.notice("Questo è un messaggio di log personalizzato")

Best Practice sui Livelli di Log

Il ciclo di vita del software attraversa vari ambienti di esecuzione; solitamente gli ambienti sono: sviluppo, collaudo, produzione. Ogni ambiente di esecuzione ha le proprie caratteristiche ed anche la gestione dei log si allinea allo scopo dell'ambiente nel quale è gestita.

Negli ambienti di sviluppo, i tecnici hanno bisogno di reperire quante più informazioni possibili sul software sviluppato; in questo ambiente di solito il livello del log è impostato su DEBUG o INFO.

In un ambiente di collaudo, nel quale si verificano le funzionalità prima del passaggio in produzione, potresti impostare il livello dei log a INFO.

In ambiente di produzione, nel quale occorre conoscere se qualcosa non è andato come ci si aspettava, il livello di log può essere impostato a WARNING o ERROR.

Gestione delle eccezioni

Le eccezioni rappresentano una best practice nello sviluppo del software per quanto concerce la gestione delle anomalie. Un codice ben scritto, dovrebbe avere molte eccezioni gestite al fine di monitorare al meglio tutti i casi di comportamenti anomali del software.

Vista l'importanza che ricoprono le eccezioni, nello sviluppo del software, il logger di Python mette a disposizione un metodo per stampare a video lo stack trace dell'eccezione.

Lo stack trace può essere stampato sui log con il seguente codice:

try:
    1 / 0
except ZeroDivisionError:
    logger.exception("Un'eccezione è stata catturata")

Il livello associato alla stampa è ERROR.

Disabilitare il Logging

Un'altra funzionalità offerta da Python per il logging è quella di disabilitare i livelli. Supponiamo di aver abilitata la registrazione dei messaggi a livello DEBUG e che per una certa porzione di codice, i messaggi a livello DEBUG non vogliano essere visti. Python ci consente di disabilitare il livello DEBUG con il seguente codice:

logger = logging.getLogger(__name__)

# Disabilita DEBUG
logging.disable(logging.DEBUG)
logger.info("Questo è un messaggio di info")
logger.debug("Questo è un messaggio di debug")

# Riabilita il logging
logging.disable(logging.NOTSET)  # Riabilita il logging
logger.info("Questo è un messaggio di info")
logger.debug("Questo è un messaggio di debug")

con il precedente codice la prima chiamata disabilita il livello DEBUG e la seconda ripristina il funzionamento.

Conclusioni

In questo articolo hai avuto una panoramica completa sulla gestione dei livelli di log in Python. Hai visto quali sono i livelli di log, come creare un livello personalizzato, le best practice per i livelli sui vari ambienti di esecuzione, come gestire le eccezioni con i log, come disabilitare il logging.

Seguendo questo articolo potrai utilizzare i log ad un livello avanzato.