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')