1. 程式人生 > 其它 >【Python】Flask日誌記錄:將日誌輸出到多個檔案、顯示行號、模組名稱、日誌級別等

【Python】Flask日誌記錄:將日誌輸出到多個檔案、顯示行號、模組名稱、日誌級別等

技術標籤:DEVOPS

參考文章:Flask使用日誌記錄到檔案示例-部落格園

flask的日誌記錄需要用到python標準庫logging的支援。

示例

# -*- coding: utf-8 -*-

from flask import Flask
import logging

app = Flask(__name__)


@app.route('/')
def root():
    app.logger.info('info log')
    app.logger.warning('warning log')
    return 'hello'

if __name__ == '__main__':
    app.debug = True
    handler = logging.FileHandler('flask.log', encoding='UTF-8')
    handler.setLevel(logging.DEBUG) # 設定日誌記錄最低級別為DEBUG,低於DEBUG級別的日誌記錄會被忽略,不設定setLevel()則預設為NOTSET級別。
    logging_format = logging.Formatter(
        '%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
    handler.setFormatter(logging_format)
    app.logger.addHandler(handler)
    app.run()

控制日誌記錄格式,效果如上述記錄內容;在Python參考文件中有更詳細的說明,這裡簡單介紹一下:

%(asctime)s 即日誌記錄時間,精確到毫秒
%(levelname)s 即此條日誌級別
%(filename)s 即觸發日誌記錄的python檔名
%(funcName)s 即觸發日誌記錄的函式名
%(lineno)s 即觸發日誌記錄程式碼的行號
%(message)s 這項即呼叫如app.logger.info(‘info log’)中的引數,即message

日誌檔案:flask.log

2019-11-08 23:18:51,769 - INFO - manager.py - root - 10 - info log

2019-11-08 23:18:51,770 - WARNING - manager.py - root - 11 - warning log


將日誌輸出到多個檔案

示例如下,產生log1.log和log2.log兩個日誌檔案。
同理,可以靈活地將不同模組中的日誌加以區分,輸出到不同檔案中。例如,views.py
在這裡插入圖片描述

from __future__ import absolute_import

import logging

def setup_logger(logger_name, log_file, level=logging.INFO):
    l = logging.getLogger(logger_name)
    formatter = logging.Formatter('%(asctime)s : %(message)s')
    fileHandler = logging.FileHandler(log_file, mode='w')
    fileHandler.setFormatter(formatter)
    streamHandler = logging.StreamHandler()
    streamHandler.setFormatter(formatter)

    l.setLevel(level)
    l.addHandler(fileHandler)
    l.addHandler(streamHandler)

def main():
    setup_logger('log1', r'log1.log')
    setup_logger('log2', r'log2.log')
    log1 = logging.getLogger('log1')
    log2 = logging.getLogger('log2')

    log1.info('Info for log 1!')
    log2.info('Info for log 2!')
    log1.error('Oh, no! Something went wrong!')

if '__main__' == __name__:
    main()