2015-08-26 16 views
14

Ho creato un'app su Heroku e spingo la mia app Django su di esso.Accesso a Django su Heroku non visualizzato

Monitoro i registri utilizzando heroku logs --tail per vederli in tempo reale.

Poi, nel mio settings.py, ho il seguente:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'formatters': { 
     'verbose': { 
      'format': ('%(asctime)s [%(process)d] [%(levelname)s] ' + 
         'pathname=%(pathname)s lineno=%(lineno)s ' + 
         'funcname=%(funcName)s %(message)s'), 
      'datefmt': '%Y-%m-%d %H:%M:%S' 
     }, 
     'simple': { 
      'format': '%(levelname)s %(message)s' 
     } 
    }, 
    'handlers': { 
     'null': { 
      'level': 'DEBUG', 
      'class': 'logging.NullHandler', 
     }, 
     'console': { 
      'level': 'INFO', 
      'class': 'logging.StreamHandler', 
      'formatter': 'verbose', 
      'stream': sys.stdout, 
     } 
    }, 
    'loggers': { 
     'MYAPP': { 
      'handlers': ['console'], 
      'level': 'INFO', 
     } 
    } 
} 

Poi, quando voglio registrare qualcosa, io uso il seguente:

import logging 
import sys 

logger = logging.getLogger('MYAPP') 
logger.info('My message here...') 
sys.stdout.flush() 

ma non si riflette nella i miei registri

mio Procfile:

web: gunicorn myapp.wsgi --log-file=- 

EDIT: Curiosamente, posso effettivamente cambiare "myapp" a "Django" quando definisco la mia registrazione config e anche logging.getLogger('django') e che mi permette di vedere qualsiasi cosa utilizzando print nei miei ceppi , ma nulla dal logger formattato che ho definito.

ho anche PYTHONUNBUFFERED=true e DEBUG=1 set per il mio ambiente di staging, ma non vedo nessuno dei ceppi che vedo quando si utilizza la mia versione locale con foreman start web.

Che cosa sta causando questo e come vedo i miei registri dal vivo in Heroku?

+0

cosa è Procfile? Con Gunicorn puoi specificare il livello di registro e il file di registro. – pchiquet

+0

Come gestisci la tua app su Heroku? Con uWSGI o Gunicorn o qualcos'altro? – rkrzr

+0

mio 'Procfile' è:' web: gunicorn myapp.wsgi --log-file - ' – lollercoaster

risposta

7

tuo Procfile è probabilmente colpa qui:

Se si desidera avere gunicorn accedere a stdout è necessario utilizzare l'opzione della riga di comando --logfile=- (vi manca la =!) Secondo this answer.

Così l'intero Procfile dovrebbe essere così:

web: gunicorn myapp.wsgi --log-file=-

EDIT:

Poiché le dichiarazioni di stampa stanno lavorando per voi, ma la registrazione non è, la configurazione di registrazione è probabilmente in difetto. Assicurarsi di impostare la registrazione durante l'avvio della vostra applicazione (da dove chiami dictConfig nel codice?):

import logging 
logging.config.dictConfig(LOGGING) 
logger = logging.getLogger('MYAPP') 
logger.info("Just testing") 
+0

Hmm, questo non sembra essere d'aiuto. Non riesco ancora a vedere l'output registrato dal vivo nella shell 'heroku logs --tail'. – lollercoaster

+0

@lollercoaster quale versione di Gunicorn stai usando? A partire dalla versione R20, si sta registrando di nuovo su stdout per impostazione predefinita. Quindi non avresti bisogno del flag della riga di comando. Prova anche ad aggiungere '--log-level = debug', giusto per assicurarti che questo non sia il problema. – rkrzr

+0

Sto usando 'gunicorn == 19.3.0', che è quello che heroku usa per lo stack di Django. – lollercoaster

1

La configurazione Procfile e LOGGING guarda bene. Django configura il logger appena prima che le app vengano importate, quindi se provi a loggare anche prima di (ad esempio, ad esempio dal file settings.py), non funzionerà.

EDIT:

LOGGING config:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'formatters': { 
     'verbose': { 
      'format': ('%(asctime)s [%(process)d] [%(levelname)s] ' 
         'pathname=%(pathname)s lineno=%(lineno)s ' 
         'funcname=%(funcName)s %(message)s'), 
      'datefmt': '%Y-%m-%d %H:%M:%S' 
     }, 
     'simple': { 
      'format': '%(levelname)s %(message)s' 
     } 
    }, 
    'handlers': { 
    'null': { 
      'level': 'DEBUG', 
      'class': 'logging.NullHandler', 
    }, 
     'console': { 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
      'formatter': 'verbose' 
     } 
    }, 
    'loggers': { 
    'ex_logger': { 
      'handlers': ['console', ], 
      'level': 'INFO', 
     } 
    } 
} 

aggiungendo in seguito a settings.pynon registrerà:

import logging 
logger = logging.getLogger('ex_logger') 
logger.info("core.settings logger") # won't work 

aggiungendo al views.pydovrebbe accedere :

0

Come indicato nelle precedenti risposte, il registratore deve essere impostato nel punto di ingresso della propria app. Nel caso di un server Web basato su django che utilizza gunicorn, il punto di ingresso è molto probabilmente il file wsgi.py. Prova ad aggiungere la configurazione richiesta a quel file, ad es. impostazione del logger di base globale:

import logging 
import os 

from dj_static import Cling 

from django.core.wsgi import get_wsgi_application 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "path.to.settings.py") 

logging.basicConfig(
    level=logging.INFO, 
    format="%(asctime)s %(name)s %(levelname)-8s %(message)s", 
) 
Problemi correlati