使用 Flask 時,如何優雅的輸出日誌

Flask logging

簡述,細節展示不清楚的地方多看一下python的logging模塊

留言交流(需FQ)可以移步我的博客

使用 Flask 時,如何優雅的輸出日誌。這些日誌也許需要特定的格式,更豐富的信息,或者添加一些上下文的信息(如當前登錄的用戶名)等等。

根據官方文檔來看,當想要爲項目配置日誌時,應當在程序啓動時儘早進行配置。比如在flask_app = Flask(‘api-controller’)之前配置。
如果不配置,flask 會create_logger

flask source code 中是這樣的

default_handler = logging.StreamHandler(wsgi_errors_stream)
default_handler.setFormatter(
    logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s")
)

所以使用缺省配置時

如果在操作 app.logger 之後配置日誌,並且需要 移除缺省的日誌記錄器,可以導入並移除它:

from flask.logging import default_handler

flask_app.logger.removeHandler(default_handler)

實際上,在設置完 basicConfig 後也可以通過下面方式修改。這段代碼的影響是**在所有日誌後面增加一個上下文參數(當前登錄的用戶名)

from flask import g
username = g.user.name
root = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)-8s %(message)s' + f" User: {username}")
handler.setFormatter(formatter)
root.handlers = [handler]

應用程序代碼可以在一個模塊中定義和配置父記錄器,並在單獨的模塊中創建(但不配置)子記錄器,並且對子記錄器的所有調用都將傳遞給父記錄器。

比如上面的 logging.getLogger() # 同 logging.getLogger(’’) 其實就是獲取了 root logger 並作修改。
上述代碼寫在 @app.before_request函數中,會對所有的日誌輸出有影響; 如果寫在@app.after_request函數中,只會影響werkzeug的日誌輸出。 比如在flask應用中我們的目錄爲app

# create logger with app and config it
logging.getLogger("app").setLevel(log_level)

那麼所有的 app.* 文件下的 logger 都會這個父記錄器的影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章