讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

Python怎么记录Web日志_logging模块按天滚动输出并保留请求链路

浅萱酱_1045

浅萱酱_1045

发布时间:2026-03-16 06:15:08

|

1069人浏览过

|

来源于php中文网

原创

必须用 TimedRotatingFileHandler 实现按天滚动,配置 when='midnight'、interval=1、utc=False、backupCount 合理、encoding='utf-8';日志链路需用 LoggerAdapter 注入 request_id 并兜底空值;避免 uvicorn 与自定义 logger 冲突需设 propagate=False 或关闭其日志。

python怎么记录web日志_logging模块按天滚动输出并保留请求链路

logging.FileHandler 无法按天滚动,得换 RotatingFileHandler 的兄弟

直接用 FileHandler 只能写死一个文件,根本不会切日期。真要按天生成 app.log.2024-05-20 这种文件,必须上 TimedRotatingFileHandler——它专为时间维度滚动设计,不是靠文件大小,而是靠 when='midnight' 触发切割。

常见错误是把 backupCount 设太小(比如 3),结果日志只留最近三天,审计时发现上周五的请求链路没了;或者漏设 encoding='utf-8',中文路径或日志内容一写就报 UnicodeEncodeError。

  • when='midnight' 是最稳的选择,避免用 'D'(已弃用)或 'MIDNIGHT'(大小写敏感,错写就静默失效)
  • interval=1 必须配 when='midnight',单独设 interval 没用
  • utc=False(默认),别开 UTC,否则凌晨 0 点可能在你本地时间 7 点才切
  • 文件名里别硬编码日期,TimedRotatingFileHandler 自动追加后缀,起始文件就叫 app.log

Web 请求链路怎么塞进每条日志里?靠 LoggerAdapter + request_id

Flask 或 FastAPI 里,每个请求进来时生成唯一 request_id,但 logging 模块本身不感知上下文。硬在每个 logger.info() 里手动传 extra={'request_id': xxx} 既啰嗦又容易漏。正确姿势是用 LoggerAdapter 封一层,让它自动注入。

注意:不能在全局 logger 上直接 setLevel 或 addHandler 后再套 Adapter,Adapter 只负责 enrich 日志 record,不接管 handler。handler 还得自己配好再挂上去。

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

Biopython
Biopython

全面的分子生物学工具集。适用于序列操作、文件解析(FASTA/GenBank/PDB)、系统发育分析,以及通过 Bio.Entrez 以编程方式访问 NCBI/

下载
  • 每次请求进 middleware 时生成 request_id = str(uuid.uuid4()),存进 flask.g 或 contextvars.ContextVar
  • Adapter 的 process() 方法里从上下文取 request_id,拼进 extra 返回
  • Formatter 的 format 字符串里必须包含 %(request_id)s,否则 Adapter 塞了也白塞
  • 别用线程局部变量(threading.local)存 request_id —— 异步框架(如 FastAPI + uvicorn)下会串数据

Formatter 里加 trace_id 要防 KeyError,空值得兜底

如果某次请求没走完整中间件(比如 400 错误提前返回),request_id 可能压根没设,Formatter 一读 %(request_id)s 就崩,整条日志变空行甚至中断输出。这不是配置错,是日志系统对缺失字段零容忍。

解决方法不是改 Formatter 模板语法,而是让 Adapter 的 process() 总返回 dict,且 key 存在、value 可为空字符串。

  • Adapter 的 process() 返回 (msg, kwargs) 时,确保 kwargs['extra'] 里 request_id 键一定存在
  • 值可以是 '' 或 'N/A',但不能是 None(Formatter 会把它转成字符串 'None',看着像真值)
  • Formatter 模板建议写成:%(asctime)s %(name)s %(levelname)s [%(request_id)-12s] %(message)s,-12s 对齐,空值也占位
  • 别在 Formatter 里写 Python 表达式(比如 %(request_id or 'MISSING')s)—— logging 不支持这种语法

FastAPI + uvicorn 下日志重复打印的根源和解法

开 uvicorn 时加了 --log-level info,又在代码里配了 TimedRotatingFileHandler,结果同一条请求日志在终端打两遍、文件里再写一遍。这不是 bug,是 uvicorn 自带 logger 和你手配的 logger 同时生效了。

uvicorn 默认把日志发给 root logger,而你的 getLogger('myapp') 如果没设 propagate=False,消息会一路冒泡到 root,被 uvicorn 的 handler 再捕一次。

  • 所有自定义 logger 创建后立刻设 logger.propagate = False
  • uvicorn 启动时加 --access-log=False --error-log=False 关掉它的输出,只留你配的 handler
  • 别信文档里“uvicorn 用 structlog 就不重”——你没换日志库,只是关掉它的 handler 更直接
  • 检查 handler 是否被重复 addHandler:每次 reload(比如 debug 模式)都可能新挂一个,用 if not logger.handlers: 包一层

按天滚动本身不难,难的是 request_id 在异步/多进程/热重载场景下不丢、不串、不空;而日志不重复的前提,是你得先分清哪条 handler 属于谁。这些点没卡准,文件天天切,链路照样断。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1911

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

5324

2023.07.25

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

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

1849

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

32177

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3807

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3827

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1263

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

616

2023.08.10

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

80

2026.11.06

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn