Python flask 多线程 logging 导致进程变慢和 TimedRotatingFileHandler 缺少日志

Python的logging模块在多线程环境中可能导致进程变慢,QueueHandler和QueueListener能改善这个问题,但与TimedRotatingFileHandler配合时存在日志丢失和切分错误。作者重写了TimedRotatingFileHandler以实现按小时切分并保留50个文件。线上环境重启时,TimedRotatingFileHandler可能覆盖当前日志,这可能与未调用stop()有关。建议避免使用TimedRotatingFileHandler,自行实现时间切分逻辑。
摘要由CSDN通过智能技术生成

Python logging是不太支持多线程的,要不然可能会重复写很多日志使进程变慢。这里选择 QueueHandler 和 QueueListener 处理 flask 日志,其他线程调用 QueueHandler 往queue里发送日志消息,启动一个监听线程 QueueListener 调用 TimedRotatingFileHandler 从queue里获取日志消息,往日志文件里写日志。

import queue
import logging
from logging.handlers import QueueHandler
from logging.handlers import QueueListener, TimedRotatingFileHandler
from logging import FileHandler
import datetime, time
import threading
import re
import os
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s : %(message)s')
log_que = queue.Queue(-1)
queue_handler = QueueHandler(log_que)

def send_logger_demo():
	logger = logging.getLogger()
	logger.addHandler(queue_handler)
	logger.setLevel(logging.INFO)


def start_log_service():
	log_path = os.environ['HOME'] + "/sphinx_log"
	if not os.path.exists(log_path):
		os.makedirs(log_path)
	handler = TimedRotatingFileHandler(filename=log_path + "/sphinx.log", when="S", interval=1, backupCount=5)
	handler.suffix = "%Y-%m-%d.log"
	handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值