1. 程式人生 > >Flask日誌資訊列印如何改變位置

Flask日誌資訊列印如何改變位置

在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的行為進行寫日誌動作!