2015-06-19 68 views
7

我正在使用Python/Flask應用程序並嘗試在json中獲取要格式化的日誌(按行)。在json中格式化Flask應用程序日誌

使用Python,JSON記錄器包,我已經修改了格式爲app.logger如下:

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

可正常工作。傳遞給app.logger的任何消息在json中都格式正確。

但是,應用程序也會自動記錄所有請求。此信息在標準輸出中顯示如下:

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

我希望此信息能夠在json中格式化。我一直在尋找負責創建這個輸出沒有成功的記錄器/代碼。

該輸出在哪裏產生? 機制是否改變此記錄信息的格式?

+0

你看到這些日誌可能是從你使用的Web服務器而不是來自你的'wsgi'應用程序。你在使用哪臺服務器? – sirfz

+0

@MartijnPieters你可能是對的,但是'Flask'記錄訪問請求是沒有意義的,因爲它不應該是它的工作 – sirfz

+0

@sirfz:除非它不是。你其實是正確的。 –

回答

3

當您使用app.logger屬性的第一次,瓶設置一些日誌處理程序:

  • 被設置爲登錄DEBUG級別和過濾器上app.debug是真正的調試記錄。
  • 生產記錄器設置爲ERROR

您可以再次自己刪除這些處理程序,通過運行:

app.logger.handlers[:] = [] 

但是,你看日誌行不被記錄瓶,而是由WSGI服務器。內置的Werkzeug服務器(在使用app.run()時使用)和其他各種WSGI服務器都可以執行此操作。例如Gunicorn使用默認的Python記錄器來記錄訪問。

內置的WSGI服務器不應該用於生產(它不會很好地擴展,並且不會對抗惡意攻擊者的戰鬥)。

對於Gunicorn,您可以禁用日誌傳播保持獨立的記錄:

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