一、日志存储的核心问题
- 三个灵魂拷问:
- 1. 怎么写? → 同步 / 异步 / 队列
- 2. 存哪里? → 本地文件 / Redis / ES / 云服务
- 3. 怎么不丢? → 容器挂载 / 持久化卷
复制代码 二、单机方案
方案 1:同步写本地文件
模块: Python 内置 logging + RotatingFileHandler / TimedRotatingFileHandler- from logging.handlers import TimedRotatingFileHandler
- # 按天轮转,保留30天
- handler = TimedRotatingFileHandler(
- "logs/app.log", when="midnight", backupCount=30
- )
复制代码 特点:
- ✅ 零依赖,最简单
- ❌ 阻塞主线程,logger.info() 要等磁盘写完才返回
适合: 小项目、开发环境
方案 2:异步写本地文件(线程级)⭐
模块: Python 内置 QueueHandler + QueueListener- from logging.handlers import QueueHandler, QueueListener
- from queue import Queue
- log_queue = Queue()
- listener = QueueListener(log_queue, file_handler) # 后台线程消费
- listener.start()
- logger.addHandler(QueueHandler(log_queue)) # 主线程只往队列丢
复制代码 原理:- 主线程 后台线程
- │ │
- │ logger.info("xxx") │
- │ │ │
- │ ▼ │
- │ 丢进 Queue(瞬间完成) │
- │ │ │
- │ 立即返回 ✅ │ ← 从 Queue 取出,写入文件
- ▼ ▼
复制代码 特点:
- ✅ 不阻塞主线程,丢进 Queue是内存操作 速度极快,后台线程从 Queue 取出写入磁盘 需要io。
- ✅ Python 内置,无额外依赖
- ❌ 本质是多线程,仍会占用 GIL
- ❌ 程序崩溃时队列中未消费的日志可能丢失
适合: 通用场景,Flask / Django 等同步框架
方案 3:线程队列 + 批量写入
模块: threading + queue.Queue + 自定义 Handler
核心思想:
[code]方案2:每条日志 → 写一次文件(10000条 = 10000次 I/O)方案3:攒100条 → 写一次文件(10000条 = 100次 I/O)
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |