2015-08-26 15 views
14

Stworzyłem aplikację na Heroku i popycham do niej aplikację Django.Logowanie do Django na Heroku nie pojawia się

Monitoruję dzienniki za pomocą heroku logs --tail, aby wyświetlić je w czasie rzeczywistym.

Następnie w moim settings.py, mam następujące:

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', 
     } 
    } 
} 

Wtedy, gdy chcę coś zalogować, używam następujące:

import logging 
import sys 

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

ale nie jest to odzwierciedlone w moje logi.

My Procfile:

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

EDIT: Co ciekawe, rzeczywiście mogę zmienić "MojaApl" na "Django", kiedy definiują moją rejestrowania config, a także logging.getLogger('django') i że pozwala mi zobaczyć coś używając print w moich dziennikach , ale nic z sformatowanego rejestratora, który zdefiniowałem.

Mam nawet PYTHONUNBUFFERED=true i DEBUG=1 zestaw dla mojego środowiska pomostowego, ale nie widzę żadnej z bali, które widzę, kiedy przy moim lokalną wersję z foreman start web.

Co jest przyczyną tego i jak mogę zobaczyć moje dzienniki na żywo w Heroku?

+0

co to jest Procfile? Za pomocą Gunicorn można określić poziom dziennika i plik dziennika. – pchiquet

+0

Jak uruchomić aplikację na Heroku? Z uWSGI lub Gunicorn czy czymś innym? – rkrzr

+0

my 'Procfile' is:' web: gunicorn myapp.wsgi --log-file - ' – lollercoaster

Odpowiedz

7

Twój Procfile jest prawdopodobnie zawinił tu:

Jeśli chcesz mieć gunicorn zalogować do stdout trzeba użyć opcji wiersza poleceń --logfile=- (brakuje w =!) Według this answer.

Więc cała Procfile powinna wyglądać następująco:

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

EDIT:

Ponieważ sprawozdanie drukujące pracują dla ciebie, ale rejestracja nie jest twoje ustawienia logowania jest prawdopodobnie winy. Upewnij się, że skonfigurować rejestrowanie podczas uruchamiania aplikacji (jeżeli dzwonisz dictConfig w kodzie):

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

Hmm, to nie pomaga. Nadal nie widzę zarejestrowanych na żywo danych wyjściowych w powłoce 'heroku logs --tail'. – lollercoaster

+0

@lollercoaster, której wersji Gunicorn używasz? Począwszy od wersji R20, loguje się ponownie do standardowego stdout. Więc nie potrzebujesz w ogóle flagi linii poleceń. Spróbuj także dodać '--log-level = debug', aby upewnić się, że to nie jest problem. – rkrzr

+0

Używam 'gunicorn == 19.3.0', który jest używany przez heroku dla stosu Django. – lollercoaster

1

Konfiguracja Procfile i LOGGING wygląda dobrze. Django konfiguruje rejestrator tuż przed zaimportowaniem aplikacji, więc jeśli spróbujesz zalogować się wcześniej niż (np. Z pliku settings.py), to nie zadziała.

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', 
     } 
    } 
} 

dodanie następujących do settings.pynie będzie rejestrować:

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

dodanie do views.pypowinien zalogować :

from django.http import HttpResponse 
import logging 

logger = logging.getLogger('ex_logger') 
logger.info("core.views logger") # should work                           

def url_please(request): 
    logger.info("path: %s" % request.path) # should work                        
    return HttpResponse(request.path) 
0

Jak stwierdzono w poprzednich odpowiedziach, rejestrator powinien zostać skonfigurowany w punkcie wejścia do aplikacji. W przypadku serwera opartego na django używającego gunicorn, ten punkt wejścia jest najprawdopodobniej plikiem wsgi.py. Spróbuj dodać wymaganą konfigurację do tego pliku, np. ustawienie globalnego rejestratora podstawowego:

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", 
)