Python配置日志格式教程_统一日志规范

发布时间 - 2026-01-11 00:00:00    点击率:
Python日志配置核心是通过basicConfig或Formatter+Handler统一格式,推荐含时间、级别、模块名、行号和消息的结构化输出,兼顾可读性与机器解析;需注意调用时机、第三方库适配及生产环境输出目标选择。

Python中配置日志格式,核心是通过logging.basicConfig()Formatter对象定义输出样式,让所有日志具备时间、级别、模块名、行号和消息等统一字段,便于排查问题和集中采集。

用basicConfig快速统一基础格式

适合脚本或简单项目,一行代码即可生效(注意:仅首次调用有效):

import logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s [%(levelname)-5s] %(name)s:%(lineno)d - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)

说明:

  • %(asctime)s:自动注入格式化后的时间,依赖datefmt
  • [%(levelname)-5s]:左对齐、占5字符宽的级别名(如 INFO、ERROR)
  • %(name)s:记录器名(默认为root,可自定义)
  • %(lineno)d:日志所在源码行号,调试时非常关键
  • 该配置会影响所有未单独设置handler的logger

用Formatter+Handler精细控制多输出目标

当需同时输出到控制台和文件,并且格式/级别不同,推荐显式创建Handler:

import logging

logger = logging.getLogger('myapp') logger.setLevel(logging.DEBUG)

控制台输出(简洁格式)

console_handler = logging.StreamHandler() console_formatter = logging.Formatter( '%(levelname)s - %(message)s' ) console_handler.setFormatter(console_formatter) logger.addHandler(console_handler)

文件输出(完整格式,含时间与位置)

file_handler = logging.FileHandler('app.log', encoding='utf-8') file_formatter = logging.Formatter( '%(asctime)s | %(levelname)-8s | %(name)s:%(funcName)s:%(lineno)d | %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler)

关键点:

  • 每个Handler可绑定独立Formatter,实现“同日志、不同展现”
  • %(funcName)s能显示函数名,比%(name)s更准确定位逻辑位置
  • 文件Handler建议加encoding='utf-8'避免中文乱码
  • 务必调用logger.addHandler(),否则日志不会输出到该目标

统一规范建议(团队协作推荐)

为保障日志可读性与机器可解析性,建议固定以下字段顺序和格式:

  • 时间戳:%(asctime)s + datefmt='%Y-%m-%dT%H:%M:%S'(ISO 8601,利于ELK解析)
  • 日志级别:[%(levelname)-5s],大写、左对齐、固定宽度
  • 模块标识:%(name)s(按模块命名logger,如logging.getLogger(__name__)
  • 代码位置:%(filename)s:%(lineno)d%(module)s.%(funcName)s:%(lineno)d
  • 业务消息:%(message)s,避免换行,关键参数用logger.info("user_id=%s, action=%s", uid, action)结构化传入

避免常见坑

实际配置中容易忽略的细节:

  • basicConfig()必须在任何logger.xxx()之前调用,否则无效
  • 若使用第三方库(如requests、sqlalchemy),它们自带logger,需单独设置其level(如logging.getLogger("requests").setLevel(logging.WARNING)
  • 生产环境禁用StreamHandler,优先写文件或对接Syslog/Fluentd
  • 不要在format字符串里硬编码颜色或ANSI序列——终端渲染应由Handler(如colorlog)负责,而非Formatter


# python  # 编码  # app  # 中文乱码  # stream  # asic 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用withoutEvents方法临时禁用模型事件  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  原生JS实现图片轮播切换效果  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Python结构化数据采集_字段抽取解析【教程】  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel中的Facade(门面)到底是什么原理  Android使用GridView实现日历的简单功能  高端企业智能建站程序:SEO优化与响应式模板定制开发  Android自定义listview布局实现上拉加载下拉刷新功能  IOS倒计时设置UIButton标题title的抖动问题  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel怎么实现验证码(Captcha)功能  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Laravel如何实现本地化和多语言支持?(i18n教程)  怎么用AI帮你设计一套个性化的手机App图标?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何安全更换建站之星模板并保留数据?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何快速建站并高效导出源代码?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  中山网站推广排名,中山信息港登录入口?  高端网站建设与定制开发一站式解决方案 中企动力  在线制作视频的网站有哪些,电脑如何制作视频短片?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  JavaScript如何实现路由_前端路由原理是什么  javascript中对象的定义、使用以及对象和原型链操作小结  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  活动邀请函制作网站有哪些,活动邀请函文案?  ,交易猫的商品怎么发布到网站上去?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  如何在云服务器上快速搭建个人网站?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Laravel如何使用Blade模板引擎?(完整语法和示例)  手机软键盘弹出时影响布局的解决方法  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  如何正确下载安装西数主机建站助手?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法