Flask日志使用記錄

Flask日志使用記錄

基礎(chǔ)與python標準庫logging 官網(wǎng)

日志庫采用模塊化方法,并提供幾類組件:記錄器、處理程序、過濾器和格式化程序

基本步驟
# 1.實例化 Logging類
logger = logging.getLogger(__name__)
# 2.記錄器 Logger.setLevel() 設(shè)置日志等級
logger.setLevel(logging.INFO)
# 3.自定義格式化formatter 
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
# 4.輸出到console/文件
  # 控制臺
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
  # 文件
file_handler = TimedRotatingFileHandler(filename=f'{self.base_dir}/logs/{file_name}.log', when='w0',backupCount=30)
file_handler.setFormatter(formatter)
# 5.添加處理程序,可以在一個logger添加讀個handler
logger.addHandler(console_handler)
logger.addHandler(file_handler)


# day日志
logger.info("log message")

格式化

formatter 字符串中格式自定義

%(levelno)s:打印日志級別的數(shù)值
%(levelname)s:打印日志級別的名稱
%(pathname)s:打印當前執(zhí)行程序的路徑,其實就是sys.argv[0]
%(filename)s:打印當前執(zhí)行程序名
%(funcName)s:打印日志的當前函數(shù)
%(lineno)d:打印日志的當前行號
%(asctime)s:打印日志的時間
%(thread)d:打印線程ID
%(threadName)s:打印線程名稱
%(process)d:打印進程ID
%(message)s:打印日志信息
處理程序
  • StreamHandler

實例發(fā)送消息到流(類似文件對象)

  • TimedRotatingFileHandler

實例將消息發(fā)送到硬盤文件,以特定的時間間隔輪換日志文件

py_log1.jpg
示例:

需要打印時調(diào)用對應示例對象

import logging
import os
import re
from logging.handlers import TimedRotatingFileHandler


class MyLogging():

    def __init__(self, log_name='', file_name='error'):
        self.logger = logging.getLogger(f'INTEL{log_name}')
        self.base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        self.check_root_dir()
        self.set_log_level(file_name)
        self.formatter = logging.Formatter(
            f'|{log_name}| %(asctime)s |%(levelname)s| [funcName:%(funcName)s] [line:%(lineno)d] %(message)s')
        file_handler = TimedRotatingFileHandler(filename=f'{self.base_dir}/logs/{file_name}.log', when='w0',
                                                backupCount=30)
        # 日志保留30天,每周一自動切割
        file_handler.suffix = "%Y-%m-%d.log"
        # extMatch是編譯好正則表達式,用于匹配日志文件名后綴
        # 需要注意的是suffix和extMatch一定要匹配的上,如果不匹配,過期日志不會被刪除。
        file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log$")
        console = logging.StreamHandler()
        console.setFormatter(self.formatter)
        file_handler.setFormatter(self.formatter)
        self.logger.addHandler(console)
        self.logger.addHandler(file_handler)

    def set_log_level(self, log_level):

        if log_level == 'error':
            self.logger.setLevel(logging.ERROR)
        elif log_level == 'debug':
            self.logger.setLevel(logging.DEBUG)
        else:
            self.logger.setLevel(logging.INFO)

    def check_root_dir(self):
        path = f'{self.base_dir}/logs'
        if not os.path.exists(path):
            os.makedirs(path)


my_request_log = MyLogging(log_name='REQUEST',file_name='requests')
my_info_log = MyLogging(log_name='INFO',file_name='info')
my_error_log = MyLogging(log_name='ERROR',file_name='error')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容