2015-06-19 13 views
7

Sto lavorando con un'applicazione Python/Flask e sto cercando di ottenere i log da formattare (per riga) in json.Formatting Flask app logs in json

Usando il pacchetto python-JSON-logger, ho modificato il formattatore per l'app.logger come segue:

from pythonjsonlogger import jsonlogger 
formatter = jsonlogger.JsonFormatter(
    '%(asctime) %(levelname) %(module) %(funcName) %(lineno) %(message)') 
app.logger.handlers[0].setFormatter(formatter) 

Questo funziona come previsto. Tutti i messaggi passati a app.logger sono formattati correttamente in json.

Tuttavia, l'applicazione registra automaticamente tutte le richieste. Queste informazioni vengono visualizzate nello stdout come segue:

127.0.0.1 - - [19/Jun/2015 12:22:03] "GET /portal/ HTTP/1.1" 200 - 

Desidero che questa informazione sia formattata anche in JSON. Stavo cercando il logger/codice che è responsabile della creazione di questo output senza successo.

Dove viene generata questa uscita? I meccanismi per modificare la formattazione di queste informazioni registrate?

+0

Quei tronchi che stai vedendo sono probabilmente provenienti dal server web che si sta utilizzando e non dal 'wsgi' app. Quale server stai usando? – sirfz

+0

@MartijnPieters potresti avere ragione ma non avrebbe senso per 'Flask' ​​per registrare le richieste di accesso in quanto non dovrebbe essere il suo lavoro – sirfz

+0

@sirfz: tranne, non è così. In effetti, sei corretto. –

risposta

3

Quando si utilizza l'attributo app.logger per la prima volta, Flask imposta alcuni gestori di registro:

  • un logger di debug che è impostato per accedere livello DEBUG e che i filtri sul app.debug essere vera.
  • un registratore di produzione impostato su ERROR.

È possibile rimuovere quei gestori di nuovo da soli, eseguendo:

app.logger.handlers[:] = [] 

Tuttavia, la linea di registro che si vede non viene registrato dal Flask, ma dal server WSGI. Lo fa il server Werkzeug integrato (utilizzato quando si utilizza app.run()) e vari altri server WSGI. Ad esempio, Gunicorn utilizza il logger Python predefinito per registrare l'accesso.

Il server WSGI integrato non dovrebbe mai essere utilizzato in produzione (non si scalerà bene e non è temprato contro aggressori malintenzionati).

Per Gunicorn, è possibile disabilitare registro propagazione di mantenere la parte di registrazione:

logging.getLogger('gunicorn').propagate = False