2014-10-26 5 views
20

Próbuję dodać logowanie do aplikacji sieciowej, która używa Flask.Dlaczego aplikacja Flask nie tworzy żadnych dzienników, gdy jest hostowana przez Gunicorn?

Podczas hostowania za pomocą wbudowanego serwera (tj. python3 server.py) logowanie działa. Podczas hostowania za pomocą Gunicorn plik dziennika nie jest tworzony.

Najprostszy kod, który reprodukuje problem jest taki:

#!/usr/bin/env python 

import logging 
from flask import Flask 
flaskApp = Flask(__name__) 


@flaskApp.route('/') 
def index(): 
    flaskApp.logger.info('Log message') 
    print('Direct output') 
    return 'Hello World\n' 


if __name__ == "__main__": 
    logHandler = logging.FileHandler('/var/log/demo/app.log') 
    logHandler.setLevel(logging.INFO) 
    flaskApp.logger.addHandler(logHandler) 
    flaskApp.logger.setLevel(logging.INFO) 
    flaskApp.run() 

Aplikacja nazywa się używając:

gunicorn server:flaskApp -b :80 -w 4 
    --access-gfile /var/log/demo/access.log 
    --error-logfile /var/log/demo/error.log 

Podczas wniosek do strony głównej witryny, dodaje się dzieje :

  1. Otrzymuję oczekiwany HTTP 200 "Hello World \ n" w odpowiedzi.

  2. Istnieje ślad zapytania w /var/log/demo/access.log.

  3. /var/log/demo/error.log pozostaje taki sam (są tylko zdarzenia rozruchowe).

  4. Na terminalu znajduje się wiersz "Wyjście bezpośrednie".

  5. Nie ma "/var/log/demo/app.log". Jeśli utworzę plik przed uruchomieniem aplikacji, plik nie zostanie zmodyfikowany.

zauważyć, że:

  • Katalog /var/log/demo można uzyskać dostęp (odczyt, zapis, wykonanie) przez wszystkich, więc nie jest to problem uprawnienia.

  • Jeśli dodaję StreamHandler jako drugi moduł obsługi, to nadal nie będzie śladu komunikatu "Komunikat dziennika" ani w terminalu, ani w dziennikach Gunicorn.

  • Gunicorn jest instalowany przy użyciu pip3 install gunicorn, więc nie powinno być żadnych niezgodności z wersjami Python.

Co się dzieje?

Odpowiedz

24

Podczas korzystania z python3 server.py uruchamiasz skrypt server3.py.

Podczas korzystania gunicorn server:flaskApp ... używasz skryptu startowego gunicorn który następnie import moduł server i szuka zmiennej flaskApp w tym module.

Od server.py jest importowana __name__ var będzie zawierał "server", nie "__main__" i dlatego zalogować obsługi kod instalacyjny nie jest prowadzony.

Można po prostu przenieść kod konfiguracji programu obsługi dziennika poza sekcję if __name__ == "__main__":.Ale upewnij się, że przechowujesz tam flaskApp.run(), ponieważ nie musisz , a nie, aby to działało, gdy gunicorn importuje server.

Więcej o what does if __name__ == “__main__”: do?

+0

pamiętać również, że działa kolbę w trybie produkcyjnym przez domyślnie w gunicorn, gdzie poziom app.logger jest ustawiony na WARN, więc nie zobaczysz app.logger.info() ani app.logger.debug(). Jeśli chcesz, ustaw app.debug = True. – patricksurry

8

To podejście działa dla mnie: Importowanie modułu rejestrowania Pythona i dodanie obsługi błędów gunicorn do niego. Wówczas rejestrator będzie zalogować się do pliku gunicorn dziennika błędów:

import logging 

app = Flask(__name__) 

gunicorn_error_logger = logging.getLogger('gunicorn.error') 
app.logger.handlers.extend(gunicorn_error_logger.handlers) 
app.logger.setLevel(logging.DEBUG) 
app.logger.debug('this will show in the log') 
skrypt startowy

My Gunicorn jest skonfigurowany do wpisów dziennika wyjście do pliku tak:

gunicorn main:app \ 
    --workers 4 \ 
    --bind 0.0.0.0:9000 \ 
    --log-file /app/logs/gunicorn.log \ 
    --log-level DEBUG \ 
    --reload 
+0

Czy mogę dodać ścieżkę do pliku dziennika wewnątrz skryptu zamiast w wierszu poleceń? –

Powiązane problemy