找回密码
 立即注册
首页 业界区 业界 Python日志存储:从单机同步到分布式异步的7种方案 ...

Python日志存储:从单机同步到分布式异步的7种方案

邹弘丽 3 天前
一、日志存储的核心问题
  1. 三个灵魂拷问:
  2. 1. 怎么写?  → 同步 / 异步 / 队列
  3. 2. 存哪里?  → 本地文件 / Redis / ES / 云服务
  4. 3. 怎么不丢? → 容器挂载 / 持久化卷
复制代码
二、单机方案

方案 1:同步写本地文件

模块: Python 内置 logging + RotatingFileHandler / TimedRotatingFileHandler
  1. from logging.handlers import TimedRotatingFileHandler
  2. # 按天轮转,保留30天
  3. handler = TimedRotatingFileHandler(
  4.     "logs/app.log", when="midnight", backupCount=30
  5. )
复制代码
特点:

  • ✅ 零依赖,最简单
  • 阻塞主线程,logger.info() 要等磁盘写完才返回
适合: 小项目、开发环境
方案 2:异步写本地文件(线程级)⭐

模块: Python 内置 QueueHandler + QueueListener
  1. from logging.handlers import QueueHandler, QueueListener
  2. from queue import Queue
  3. log_queue = Queue()
  4. listener = QueueListener(log_queue, file_handler)  # 后台线程消费
  5. listener.start()
  6. logger.addHandler(QueueHandler(log_queue))  # 主线程只往队列丢
复制代码
原理:
  1. 主线程                     后台线程
  2.   │                           │
  3.   │ logger.info("xxx")        │
  4.   │      │                    │
  5.   │      ▼                    │
  6.   │  丢进 Queue(瞬间完成)    │
  7.   │      │                    │
  8.   │   立即返回 ✅              │ ← 从 Queue 取出,写入文件
  9.   ▼                           ▼
复制代码
特点:

  • ✅ 不阻塞主线程,丢进 Queue是内存操作 速度极快,后台线程从 Queue 取出写入磁盘 需要io。
  • ✅ Python 内置,无额外依赖
  • ❌ 本质是多线程,仍会占用 GIL
  • ❌ 程序崩溃时队列中未消费的日志可能丢失
适合: 通用场景,Flask / Django 等同步框架
方案 3:线程队列 + 批量写入

模块: threading + queue.Queue + 自定义 Handler
核心思想:
[code]方案2:每条日志 → 写一次文件(10000条 = 10000次 I/O)方案3:攒100条 → 写一次文件(10000条 = 100次 I/O)
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册