0

0

Python 日志异步写入是否值得

冷炫風刃

冷炫風刃

发布时间:2026-02-24 19:38:54

|

990人浏览过

|

来源于php中文网

原创

python异步日志实为线程池/队列封装的“伪异步”,非i/o层面真异步;queuehandler+queuelistener是官方推荐最稳方案,需注意启动/停止时机与异常处理。

python 日志异步写入是否值得

异步写日志在 Python 里根本做不到“真异步”

Python 的标准 logging 模块本身是同步的,所有 handler(比如 FileHandlerRotatingFileHandler)写磁盘时都会阻塞主线程。所谓“异步日志”,实际只是把日志记录动作丢进线程池或队列里延迟执行,并非 I/O 层面的异步(如 asyncio + aiofiles)。这意味着:

  • logging.info() 调用返回快了,但日志真正落盘时间不可控
  • 如果进程突然退出(比如被 kill -9),队列里没消费完的日志会丢失
  • 多进程下共享队列需额外加锁或用 Queue + spawn 方式启动子进程,否则可能卡死

常见错误现象:logging.info() 看似不卡,但服务重启后发现最后 2 秒日志全没了;或者压测时 ThreadPoolExecutor 队列积压导致 OOM。

什么时候该上“伪异步”日志

不是所有场景都适合加一层转发。只有当以下条件同时满足时,才值得引入线程/队列封装:

  • 日志量大(比如每秒 > 100 条 INFO 级别以上)
  • 写文件是性能瓶颈(可通过 strace -e trace=write python your_app.py 观察 write 系统调用耗时)
  • 日志格式简单、无跨线程状态依赖(比如不依赖 threading.local() 里的上下文)
  • 接受少量日志丢失风险(例如非审计类业务日志)

反例:金融交易系统的审计日志,必须确保每条都落盘,此时应优先优化 I/O(如用 SSD、关闭 delay=FalseFileHandler、批量刷盘),而不是加异步层。

立即学习Python免费学习笔记(深入)”;

梯子AI
梯子AI

百度推出的AI智能搜索

下载

QueueHandler + QueueListener 是最稳的方案

CPython 官方推荐的轻量级解法,不依赖第三方库,兼容 Python 3.2+,且天然支持多线程安全:

  • QueueHandler 把日志 record 放进 queue.Queue,几乎无开销
  • QueueListener 在后台线程消费队列,再分发给真实 handler(如 FileHandler
  • 可通过 respect_handler_level=True 控制是否继承原始 handler 的 level 过滤逻辑

实操建议:

- 不要自己手写线程 + while True: queue.get(),容易漏掉异常退出清理 - 启动时调用 listener.start(),退出前务必调用 listener.stop()(否则可能丢最后几条) - 若用 atexit.register(listener.stop),注意它不捕获 SIGKILL
import logging
from logging.handlers import QueueHandler, QueueListener
import queue
<p>log_queue = queue.Queue(-1)  # 无界队列,避免阻塞 logger
handler = logging.FileHandler("app.log")
listener = QueueListener(log_queue, handler)
listener.start()</p><p>logger = logging.getLogger()
logger.addHandler(QueueHandler(log_queue))
logger.setLevel(logging.INFO)</p>

concurrent.futures.ThreadPoolExecutor 就是给自己挖坑

有人图省事直接用 executor.submit(handler.emit, record),这会导致:

  • record 对象在主线程和工作线程间传递,可能引发 AttributeError: 'LogRecord' object has no attribute 'threadName'(因部分属性是 lazy 初始化的)
  • Formatter.format() 调用可能访问线程局部变量(如 %(threadName)s),结果错乱或崩溃
  • 每次 emit 都新建 formatter 实例,比 QueueListener 多一次对象构造开销

除非你明确重写了 LogRecord__getstate__ 并确保所有字段可序列化,否则别碰这条路。

事情说清了就结束。真正难的不是“怎么异步”,而是判断“要不要异步”——多数时候,调低日志级别、关掉冗余字段、换更快的存储,比加一层队列更有效。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

103

2023.09.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

866

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

452

2024.06.27

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

719

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

371

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

25

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

100

2026.02.06

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号