Flask日誌資訊列印如何改變位置
阿新 • • 發佈:2019-01-24
在Flask框架中,每處理完一條請求,都會在終端打印出一條請求的日誌資訊:
127.0.0.1 - - [31/May/2018 04:40:35] "POST /xxx/xxx/xxx HTTP/1.1" 200 -
之所以列印了這條日誌資訊,是因為Flask框架在處理完請求後,呼叫了werkzeug庫的_log函式,函式如下。
def _log(type, message, *args, **kwargs): """Log into the internal werkzeug logger.""" global _logger if _logger is None: import logging _logger = logging.getLogger('werkzeug') # Only set up a default log handler if the # end-user application didn't set anything up. if not logging.root.handlers and _logger.level == logging.NOTSET: _logger.setLevel(logging.INFO) handler = logging.StreamHandler() _logger.addHandler(handler) getattr(_logger, type)(message.rstrip(), *args, **kwargs)
如果想要修改列印日誌,可以在啟動Flask之前,定義一個root logger
import logging
logger = logging.getLogger()
file_handler = logging.FileHandler('/path/to/log/test.log')
logger.addHandler(file_handler)
logger.setLevel(logging.INFO)
app.run()
這麼做之所以能改變Flask列印資訊的地方,是因為在_log函式中有個一條判斷:
if not logging.root.handlers and _logger.level == logging.NOTSET
當在程式碼中定義了一個root logger即呼叫logging.getLogger()不傳名字引數),該條件判斷便不成立,因此,werkzeug中的 _logger = logging.getLogger(‘werkzeug’)便不會新增一個StreamHandler處理類。
另外,root logger例項的配置行為會影響帶名字logger例項的行為
logger1 = logging.getLogger() # root logger logger2 = logging.getLogger('hawk') # hawk logger file_handler = logging.FileHandler('/usr/local/usersystem/user.log') logger1.addHandler(file_handler) logger1.setLevel(logging.INFO) # 此時,當呼叫logger2時,logger2也會向日志文件中寫入內容
基於這個機制,Werkzeug中的_logger便會按照你定義的root logger的行為進行寫日誌動作!