Nuovo nella versione 2.3. Questo modulo definisce le funzioni e le classi che implementano un sistema di logging flessibile per gli errori nelle applicazioni.
Il logging viene effettuato tramite la chiamata di metodi sulle istanze della classe Logger (da qui in poi chiamati logger). Ciascuna delle istanze ha un nome, e vengono concettualmente organizzata in uno spazio dei nomi gerarchizzato, attraverso l'uso dei punti (dots) come separatori. Per esempio, un logger chiamato "scan" è il padre dei logger "scan.text", "scan.html" e "scan.pdf". I logger possono assumere qualsiasi nome si voglia, e indicano l'area di una applicazione nella quale il messaggio di log viene generato.
I messaggi di log hanno anche un livello di importanza associato ad essi. I livelli predefiniti forniti sono DEBUG, INFO, WARNING, ERROR e CRITICAL. Per convenienza, viene indicata l'importanza di un messaggio registrato sui log chiamando un metodo appropriato di Logger. I metodi sono debug(), info(), warning(), error() e critical(), che duplicano i livelli predefiniti. Non siete costretti ad usare questi livelli: potete specificarne di propri ed usare il metodo più generale Logger, log(), che prende un esplicito argomento di livello.
I livelli possono anche essere associati ai logger, essendo impostabili sia direttamente dal programmatore, che attraverso il caricamento di una configurazione di preimpostata. Quando un metodo di logging viene chiamato su di un logger, il logger confronta il proprio livello con quello associato alla chiamata di metodo. Se il livello del logger è più alto di quello della chiamata di metodo, non viene generato nessun messaggio di log. Questo è il meccanismo di base che controlla la prolissità dei messaggi di log generati.
I messaggi di logging vengono codificati come istanze della classe LogRecord. Quando un logger decide di registrare un evento, un'istanza LogRecord viene creata dal messaggio di logging.
I messaggi di logging sono soggetti ad un meccanismo di spedizione specifico attraverso l'uso degli handlers (NdT: gestori), che sono istanze di classi derivate della classe Handler. Gli handler hanno la responsabilità di garantire che i messaggi di log (nella forma LogRecord) vengano posizionati in una locazione (o insieme di locazioni) definita e comoda per gli utenti a cui sono destinati (come un utente finale, lo staff di supporto tecnico, l'amministratore di sistema, gli sviluppatori). Agli Handler vengono passate delle istanze LogRecord, intese per particolari destinazioni. Ogni logger può avere zero, uno o più handler associati ad esso (attraverso il metodo addHandler() di Logger). In aggiunta ad ogni handler associato ad un Logger, tutti gli handler associati con tutti i predecessori del logger vengono chiamati a consegnare il messaggio.
Come per i logger, anche gli handler possono acere dei livelli associati. Un livello di handler si comporta come un filtro, nello stesso modo di un livello di un logger. Se un handler decide di consegnare un evento, viene utilizzato il metodo emit() per inviare il messaggio alla sua destinazione. La maggior parte delle classi derivate di Handler definite dall'utente avranno la necessità di sovrascrivere questo emit().
In aggiunta alla classe base Handler, vengono fornite molte utili classi derivate:
Sia le classi StreamHandler che FileHandler vengono definite nella porzione prinicipale del package logging. Gli altri handler vengono definiti in un modulo derivato, logging.handlers. (Esiste anche un altro modulo derivato, logging.config, per funzionalità di configurazione).
I messaggi registrati nei log vengono formattatti per la presentazione attraverso istanze della classe Formatter. Vengono inizializzati con una stringa di formattazione in grado di essere usata con l'operatore % ed un dizionario.
Per la formattazione di messaggi multipli in un batch, possono venire utilizzate istanze di BufferingFormatter. In aggiunta alla stringa di formattazione (che viene applicata ad ogni messaggio nel batch), esiste una riserva di stringhe di formato per intestazioni e pié di pagina.
Quando il filtraggio basato sui livelli di logger o sui livelli di handler non è sufficiente, possono venire aggiunte istanze di Filter, sia alle istanze di Logger che a quelle di Handler (tramite i loro metodi addFilter()). Prima di decidere di elaborare ulteriormente un messaggio, sia i logger che gli handler consultano tutti i loro filtri sui permessi. Se ogni qualche restituisce un valore falso, il messaggio non viene ulteriormente elaborato.
La funzionalità base di Filter consente di filtrare attraverso uno specifico nome di logger. Se questa funzionalità viene utilizzata, solo i messaggi inviati al logger indicato, ed ai suoi figli, vengono autorizzati a passare attraverso i filtri, tutti gli altri vengono scartati.
In aggiunta alle classi descritte precedentemente, esistono anche un certo numero di funzioni a livello di modulo.
[name]) |
Tutte le chiamate a questa funzione con un dato name, restituiscono la stessa istanza di logger. Questo significa che l'istanza di logger non ha mai bisogno di essere passsata attraverso parti differenti di un'applicazione.
msg[, *args[, **kwargs]]) |
msg[, *args[, **kwargs]]) |
msg[, *args[, **kwargs]]) |
msg[, *args[, **kwargs]]) |
msg[, *args[, **kwargs]]) |
msg[, *args]) |
lvl) |
lvl, levelName) |
lvl) |
attrdict) |
) |
) |
klass) |
Vedete anche: