2015-06-19 21 views
7

Pracuję z aplikacją Python/Flask i próbuję uzyskać logi do sformatowania (po linii) w json.Formatowanie logów aplikacji Flask w json

Korzystanie z pakietu python-json-rejestratora, mam zmodyfikowano formatowania dla app.logger następująco:

from pythonjsonlogger import jsonlogger 
formatter = jsonlogger.JsonFormatter(
    '%(asctime) %(levelname) %(module) %(funcName) %(lineno) %(message)') 
app.logger.handlers[0].setFormatter(formatter) 

to działa zgodnie z oczekiwaniami. Wszystkie wiadomości przekazane do app.logger są poprawnie sformatowane w json.

Jednak aplikacja automatycznie rejestruje wszystkie żądania. Informacja ta pojawia się w stdout następująco:

127.0.0.1 - - [19/Jun/2015 12:22:03] "GET /portal/ HTTP/1.1" 200 - 

Chcę te informacje mają być sformatowane w json, jak również. Szukałem logger/kod, który jest odpowiedzialny za tworzenie tego wyjścia bez powodzenia.

Gdzie jest generowane to wyjście? Czy mechanizmy zmieniają formatowanie tej zalogowanej informacji?

+0

te dzienniki widzisz są prawdopodobnie pochodzących z serwera jesteś wykorzystującego a nie z 'wsgi' aplikacja. Z którego serwera korzystasz? – sirfz

+0

@MartijnPieters może masz rację, ale dla 'Flask' ​​nie ma sensu rejestrowanie żądań dostępu, ponieważ nie powinno to być jego zadaniem. – sirfz

+0

@sirfz: z wyjątkiem tego nie ma. Jesteś w rzeczywistości poprawny. –

Odpowiedz

3

Kiedy użyć atrybutu app.logger po raz pierwszy, kolba ustawia niektóre programy obsługi dziennika:

  • rejestratora debugowania, który jest ustawiony do logowania poziom DEBUG i filtrów app.debug jest prawdziwe.
  • rejestrator produkcji ustawiony na ERROR.

można ponownie usunąć te teleskopowe sobie, uruchamiając:

app.logger.handlers[:] = [] 

Jednak linia dziennika widać nie jest rejestrowane przez Kolba, ale przez serwer WSGI. Zarówno wbudowany serwer Werkzeug (używany, gdy używasz app.run()), jak i różne inne serwery WSGI, robią to. Na przykład Gunicorn używa domyślnego rejestratora Python do rejestrowania dostępu.

Wbudowany serwer WSGI nigdy nie powinien być używany w produkcji (nie będzie skalowany i nie zostanie zahartowany w walce przeciwko złośliwym napastnikom).

Dla Gunicorn można wyłączyć propagację dziennika aby utrzymać zalogowaniu osobna:

logging.getLogger('gunicorn').propagate = False