Python - Django - 4 - Logging

django python

Continuando con le nostre avventure insieme al framework Django, passiamo adesso ad un argomento molto importante per gli sviluppatori di web application: creare un buon sistema di logging. In questo articolo vedremo prima di tutto cosa si intende per logger e quali sono le tipologie messe a disposizione dal framework Django. In seguito vedremo come utilizzare un logger per registrare i cambiamenti di stato degli oggetti del catalogo della nostra applicazione web.

Prima di iniziare, vi ricordo che tutto il codice è disponibile sul nostro repository github. Rispetto al precedente articolo, ho reso più semplice il popolamento iniziale del database tramite un file JSON contenuto in /ecommerce/fixtues/init_fixture.json.
Per eseguire il popolamento, dovete entrare da terminale nella cartella del progetto e digitare il comando:
python manage.py loaddata ./ecommerce/fixtures/init_fixture.json
Maggiori dettagli sui file fixture sono forniti nelle fonti in fondo all'articolo.

Logging

Il logging è la registrazione degli eventi di un sistema. Può essere scritta all'interno di un file di testo apposito o può essere mostrata a video in una console. Se utilizzate un sistema operativo Linux, nella cartella /var/log troverete un elenco di file e cartelle in cui sono registrate le operazioni svolte dai diversi sistemi in esecuzione.
Un file di log serve agli sviluppatori per controllare il corretto funzionamento della propria applicazione: è per esempio consigliabile gestire le eccezioni scrivendo all'interno del file di log lo stacktrace che ha portato al verificarsi dell'eccezione. In questo modo sarà più facile per lo sviluppatore indagare sul problema.

Logging in Python

Python mette a disposizione il modulo logging per gestire la registrazione degli eventi. Esistono più metodi per la scrittura del log, a seconda della severità degli eventi:

  • DEBUG: fornisce una descrizione dettagliata dell'evento.
  • INFO: fornisce una descrizione semplice di un evento.
  • WARNING: indica che qualcosa di inaspettato, ma non grave, è successo.
  • ERROR: indica che è avvenuto un errore durante l'esecuzione dell'applicazione.
  • CRITICAL: indica che è avvenuto un errore critico.

Di default il modulo logging è impostato al livello WARNING.

Logging in Django

Nelle applicazioni Django è utilizzato il modulo logging all'interno delle viste e dei modelli. All'interno del file settings.py è data anche la possibilità di configurare differenti logger con specifici livelli di severità. Tali logger possono essere in seguito richiamati all'interno dell'applicazione web.
Vediamo un esempio trovato su un vecchio thread di stackoverflow:

Formatter

La keyword formatters definisce la formattazione del testo che sarà scritto/mostrato dal logger. Nell'esempio sono utilizzati due tipi di formatter, uno più leggero ed uno più "verboso".
Esiste una lista di tag da poter utilizzare per mostrare le singole informazioni nei messaggi di log. Nell'esempio riportato, il messaggio di log nel caso verboso è formato dalla data e ora in cui è scritto il messaggio (asctime), dal livello di logging del messaggio (levelname), dal percorso del file e dalla linea in cui si trova il punto del codice che ha generato il messaggio (pathname e lineno), ed infine dal messaggio stesso (message).

Handler

Con handlers si definiscono i metodi con i quali sono gestiti i messaggi di log. Nell'esempio, la configurazione ci dice che i messaggi di log saranno mostrati sia sulla console, con livello di severità INFO e formatter standard, che in un file di testo al path log/ecommerce.log, sempre con livello di severità INFO e formatter verbose.
La variabile PROJECT_PATH indica il percorso della cartella del progetto:
PROJECT_PATH = os.path.abspath(os.path.dirname(__name__))

Logger

Infine loggers definisce i differenti oggetti logger che saranno utilizzati nelle viste e nei modelli per scrivere i messaggi di log. Nel codice faremo riferimento al logger textlogger, il quale utilizzerà gli handler console e logfile.

Scrivere i messaggi di log

Nel codice della nostra applicazione sono state aggiunte delle chiamate ai metodi di logging quando si effettuano operazioni sugli oggetti Prodotto e quando un utente si autentica o si registra. I metodi rimasti inalterati sono omessi nel codice presentato di seguito nell'articolo.

Autenticazione e Registrazione

Operazioni CRUD

Si nota che in entrambi i moduli views.py è istanziato un logger del tipo definito dall'identificativo 'textlogger'. Ogni volta che si vuole creare un messaggio di informazione è chiamato il metodo info() al quale è passato il messaggio da registrare.
I metodi per le altre tipologie di messaggio sono debug(), warn(), error(), critical(), exception(). L'ultimo caso è generalmente utilizzato per mostrare uno stacktrace nel momento in cui è intercettata una eccezione.

Nel prossimo articolo, ultimo per il momento sulla serie di Django, vedremo finalmente come fare il deploy della nostra applicazione.

Per qualsiasi domanda, dubbio o precisazione, vi invito come sempre a lasciare un commento.

Fonti

Alessio Antonielli
Ingegnere informatico, appassionato di cinema, musica, videogiochi e serie tv. Insomma, le solite cose che vi aspettereste da un ex studente di Ingegneria Informatica, giusto per rafforzare lo stereotipo...
Python - Django - 4 - Logging ultima modifica: 2017-07-04T11:09:17+00:00 da Alessio Antonielli


Advertisment ad adsense adlogger