2014-12-19 10 views
6

sto provando a configurare il mio Django settings.py usare correttamente la funzione di registrazione di pitone ma ho incappato in un problema piuttosto strano:registrazione django.request al file invece di console

Anche dopo aver letto il docs, ho semplicemente non riesco a scoprire come reindirizzare le linee di richiesta di debug stampate dalla console da Django a un file che ho specificato; Di seguito è parte della mia configurazione di registrazione.

LOGGING = { 
    'version': 1, 
    'formatters': { 
     'simple': { 
      'format': '%(levelname)s %(message)s' 
     }, 
    } 
    'handlers': { 
     'file_http': { 
      'level': 'DEBUG', 
      'class': 'logging.FileHandler', 
      'filename': r'C:\mysystem-http.log', 
      'formatter': 'verbose' 
     } 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['file_http'], 
      'level': 'DEBUG', 
      'propagate': False 
     } 
    } 
} 

Continuo a vedere la mia console linea di stampa con il seguente formato:

[19/Dec/2014 11:48:03] "POST /api/v1/ HTTP/1.1" 200 10

Come posso reindirizzare questi in un file utilizzando la funzione di registrazione?

Grazie in anticipo

+0

Solo per la cronaca: se si dispone di una configurazione multiprocesso, registrazione in un file potrebbe non essere una tale idea buona, cf https://docs.python.org/3/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes –

risposta

3

Queste uscite sono gestite da server HTTP (WSGIServer dalla libreria standard, se in esecuzione in modalità dev).

La configurazione del vostro settings.py non ha nulla a che fare con questo.

+0

Diritto. Quindi, c'è un modo per reindirizzare quell'output di quella libreria usando la funzione di logging? – kstratis

+0

Dipende dal tuo stack. –

6

manage.py runserver non utilizza il sistema di registrazione per messaggi come [19/Dec/2014 11:48:03] "POST /api/v1/ HTTP/1.1" 200 10. Invece di questo, runserver usa sys.stderr (e sys.stdout per altri messaggi). Se hai davvero bisogno di reindirizzare questo file al file, puoi sovrascrivere sys.stderr settings.py. Esempio - accedendo sys.stderr su file e console:

import sys 

class Logger(object): 
    def __init__(self): 
     self.console = sys.stderr 
     self.file = open("runserver.log", "a", 0) 

    def write(self, msg): 
     self.console.write(msg) 
     self.file.write(msg) 

sys.stderr = Logger() 

Nel metodo write è possibile utilizzare il sistema di registrazione per gestire questa situazione con le impostazioni di registrazione pure.

Aggiornamento:

In Django 1.10, uscita runserver passa attraverso la registrazione: https://docs.djangoproject.com/en/dev/releases/1.10/#runserver-output-goes-through-logging

+0

Com'è meglio di un reindirizzamento bash? –

+0

Semplice, non è meglio (forse uno dei motivi è che puoi accedere a file + console nello stesso tempo e aggiungere filtri/formattatori ecc.). – dikamilo

Problemi correlati