当前位置: 首页 > ops >正文

Python -- logging --日志模块

Python logging 模块自学指南

日志记录(logging)是一种非常重要的工具,它可以帮助我们跟踪程序的运行状态,调试错误以及记录重要信息。

logging 是 Python 内置的日志记录工具,用于替代 print(),提供更灵活、强大的日志管理能力


一、为什么用 logging 替代 print?
  • 级别控制:区分调试/信息/警告/错误日志
  • 多输出目标:同时输出到控制台/文件/邮件/网络
  • 格式统一:标准化时间戳、模块名、行号等信息
  • 异步处理:避免阻塞主线程
  • 按需启用:生产环境可关闭调试日志

二、四大核心组件
组件作用示例
Logger记录日志的入口logger = logging.getLogger('app')
Handler日志输出位置(控制台/文件等)FileHandler('app.log')
Filter过滤特定日志自定义过滤规则
Formatter日志格式'%(asctime)s - %(message)s'

三、五大日志级别(从低到高)
logging.DEBUG    # 调试细节 (10)
logging.INFO     # 常规信息 (20)
logging.WARNING  # 警告事件 (30)
logging.ERROR    # 错误事件 (40)
logging.CRITICAL # 严重错误 (50)

设置全局级别logging.basicConfig(level=logging.INFO)


四、快速入门示例
import logging# 基础配置(输出到控制台)
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s [%(levelname)s] %(message)s',datefmt='%Y-%m-%d %H:%M:%S'
)# 记录日志
logging.debug("调试信息")    # 生产环境自动忽略
logging.info("程序启动")
logging.warning("磁盘空间不足")
logging.error("连接数据库失败")

五、高级用法详解
  1. 输出到文件 + 控制台
logger = logging.getLogger("my_app")
logger.setLevel(logging.DEBUG)  # 设置Logger级别# 文件处理器(记录DEBUG以上)
file_handler = logging.FileHandler("app.log")
file_handler.setLevel(logging.DEBUG)# 控制台处理器(只记录INFO以上)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)# 添加处理器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
  1. 日志文件轮转(防止过大)
from logging.handlers import RotatingFileHandler# 每个文件最大10MB,保留3个备份
rotating_handler = RotatingFileHandler("app.log", maxBytes=10*1024*1024, backupCount=3
)
  1. 异常栈记录
try:1/0
except Exception as e:logging.error("发生异常: %s", e, exc_info=True)  # 记录完整堆栈# 或直接使用 logger.exception(e)
  1. 按模块区分日志
# 主模块
main_logger = logging.getLogger("main")
main_logger.info("主模块加载")# 子模块
sub_logger = logging.getLogger("main.submodule")
sub_logger.debug("子模块详细日志")

六、最佳实践
  1. 避免使用 root logger
    始终通过 getLogger(name) 创建具名Logger

    # 推荐 ✔️
    logger = logging.getLogger(__name__)# 不推荐 ❌
    logging.info("...")
    
  2. 配置分离
    使用 logging.config.dictConfig() 从JSON/YAML加载配置:

    import logging.configconfig = {'version': 1,'handlers': {'file': {'class': 'logging.FileHandler', 'filename': 'app.log'}},'root': {'level': 'INFO', 'handlers': ['file']}
    }logging.config.dictConfig(config)
    
  3. 生产环境建议

    • 使用 WARNING 作为默认级别
    • 对错误日志配置邮件报警(SMTPHandler
    • 使用 TimedRotatingFileHandler 按天分割日志

七、完整工作流示例
import logging
from logging.handlers import RotatingFileHandlerdef setup_logger():logger = logging.getLogger("my_app")logger.setLevel(logging.DEBUG)# 控制台输出console = logging.StreamHandler()console.setLevel(logging.INFO)# 文件输出(带轮转)file = RotatingFileHandler("app.log", maxBytes=1e6, backupCount=3)file.setLevel(logging.DEBUG)# 格式设置fmt = '%(asctime)s | %(levelname)8s | %(module)s:%(lineno)d - %(message)s'formatter = logging.Formatter(fmt, datefmt='%Y-%m-%d %H:%M:%S')console.setFormatter(formatter)file.setFormatter(formatter)logger.addHandler(console)logger.addHandler(file)return loggerif __name__ == "__main__":logger = setup_logger()logger.info("程序启动")try:# ...业务代码...except Exception as e:logger.exception("致命错误")

学习资源推荐
  1. 官方文档
  2. Logging Cookbook
  3. 调试技巧:临时提升日志级别
    logging.getLogger("requests").setLevel(logging.DEBUG)
    

关键点:理解日志级别传播机制、合理设计Logger命名空间、生产环境使用异步日志库(如 logurustructlog)提升性能。

http://www.xdnf.cn/news/16014.html

相关文章:

  • VUE2 项目学习笔记 ? 语法 v-if/v-show
  • 使用docker(ubuntu)搭建web环境(php,apahce2)
  • 无人机吊舱与遥控器匹配技术解析
  • LeetCode 热题100:42.接雨水
  • 如何在 Windows 10 下部署多个 PHP 版本7.4,8.2
  • 从零搭建 OpenCV 项目(新手向)--第一天初识OpenCV与图像基础
  • javaweb小案例1
  • 开源AI智能客服、AI智能名片与S2B2C商城小程序在客户复购与转介绍中的协同效应研究
  • 在腾讯云上安装gitlab
  • Qt开发环境搭建全攻略(Windows+Linux+macOS)
  • 【Altium Designer2025】电子设计自动化(EDA)软件——Altium Designer25版保姆级下载安装详细图文教程(附安装包)
  • 基于JAVA实现基于“obj--html--pdf” 的PDF格式文本生成
  • linux内核与GNU之间的联系和区别
  • 【QT常用技术讲解】QSystemTrayIcon系统托盘
  • 大模型——Data Agent:超越 BI 与 AI 的边界
  • 跨境企业破局国际市场:海外媒体发稿如何为品牌声誉赋能?
  • 算法笔记之堆排序
  • Docker实战:使用Docker部署TeamMapper思维导图工具
  • haproxy七层代理新手入门详解
  • EasyMan 数字人服务全面焕新,交互型AI数字人助推孪生体验全新升级
  • 大模型——上下文工程如何重塑智能体的“思考方式”
  • 【接口自动化】掌握接口自动化:核心概念讲解(理论知识)
  • Qt定时器与事件循环机制
  • C#初学知识点总结
  • 牛客:最长无重复子数组
  • 西门子 S7-1500分布式 I/O通信 :PROFINET IO 与 PROFIBUS DP核心技术详解(上)
  • Axios Token 设置示例
  • 洛谷刷题7..22
  • 《计算机“十万个为什么”》之 MQ
  • 图像基础:从像素到 OpenCV 的入门指南