python日志处理核心是可靠可维护:用timedrotatingfilehandler按日期轮转并设delay=true防空文件,多进程用concurrentloghandler或queuehandler+queuelistener,formatter注入结构化字段,loggeradapter动态加业务id,分级控制支持运行时调整。

Python 日志文件处理的核心在于:用对 logging 模块的配置方式,避免手动写文件、重复打开、时间格式混乱、多进程冲突等问题。关键不是“记日志”,而是“可靠、可维护、易排查”地记日志。
按日期自动轮转 + 保留历史文件
用 TimedRotatingFileHandler 替代普通 FileHandler,按天/小时切分日志,防止单个文件无限增长:
- 设置
when='midnight'实现每日零点切割,backupCount=7保留最近 7 天 - 注意
delay=True避免程序启动时立即创建空日志文件 - 文件名中别硬编码日期,让 handler 自动命名(如
app.log.2024-05-20),否则轮转逻辑会失效
多进程安全写日志
默认的 RotatingFileHandler 和 TimedRotatingFileHandler 不支持多进程并发写入,容易丢日志或损坏文件:
- 生产环境推荐用
ConcurrentLogHandler(需pip install concurrent-log-handler),底层基于文件锁 - 若只能用标准库,改用
QueueHandler+QueueListener架构:所有进程把日志发到队列,由单独线程统一落盘 - 避免多个进程直接 open 同一个日志文件追加写
结构化日志 + 关键字段增强可查性
纯文本日志排查效率低,通过自定义 formatter 注入上下文信息:
立即学习“Python免费学习笔记(深入)”;
- 在
Formatter中使用%(asctime)s %(levelname)-8s %(name)s %(funcName)s:%(lineno)d固定字段 - 用
LoggerAdapter动态注入 request_id、user_id 等业务标识,无需每次logger.info(..., extra={...}) - 输出 JSON 格式(配合
json.dumps自定义 formatter)便于 ELK 或 Loki 采集解析
分级控制 + 运行时动态调整
不同环境/模块需要不同日志级别,且不重启就能调:
- 用
logging.getLogger('module_name')获取命名 logger,避免全用root导致误调 - 通过
logger.setLevel(logging.DEBUG)单独控制某模块详细日志,不影响其他模块 - 暴露 HTTP 接口或信号(如
kill -USR1 pid)触发logging.basicConfig(level=logging.DEBUG)临时升为 DEBUG 级别
不复杂但容易忽略:日志路径确保目录存在、权限可写;handler 加 encoding='utf-8' 防中文乱码;测试阶段开启 logging.raiseExceptions = True 快速暴露配置错误。










