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 :
Otrzymuję oczekiwany HTTP 200 "Hello World \ n" w odpowiedzi.
Istnieje ślad zapytania w
/var/log/demo/access.log
./var/log/demo/error.log
pozostaje taki sam (są tylko zdarzenia rozruchowe).Na terminalu znajduje się wiersz "Wyjście bezpośrednie".
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?
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