跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python 日志模块 logging 使用指南

Python 日志模块 logging 提供了比 print 更专业的记录工具。文章介绍了 logging 的五大级别函数 debug 到 critical,默认仅显示 WARNING 及以上。通过 basicConfig 可设置日志级别和格式,支持时间、文件名等占位符。日志可输出至控制台或文件,推荐使用 Handler 组合实现文件轮转以防磁盘占用过大。异常处理需使用 exc_info=True 或 logger.exception 获取堆栈信息。最佳实践是每个模块使用独立 Logger 命名空间以便分级控制。

星星泡饭发布于 2026/2/26更新于 2026/10/7102 浏览

认识 logging 模块

程序运行中需要记录关键信息,例如启动/结束时间、用户操作、错误原因等。日志(logging)是比 print() 更专业、更强大的工具。

基础用法

import logging
logging.warning("这是一个警告信息")

运行结果:

WARNING:root:这是一个警告信息

无需额外配置即可直接使用。默认只显示 WARNING 及以上级别的日志,输出到控制台,格式固定为 级别:logger 名:消息。

日志级别函数

函数用途示例
logging.debug()调试细节(开发时用)logging.debug("变量 x = %d", x)
logging.info()一般信息logging.info("服务已启动")
logging.warning()警告(可能有问题)logging.warning("磁盘空间不足")
logging.error()错误(功能异常)logging.error("数据库连接失败")
logging.critical()严重错误(程序可能崩溃)logging.critical("配置文件丢失!")

记忆口诀:D-I-W-E-C(严重性递增)。

设置日志级别

默认不显示 INFO 和 DEBUG,因为 logging 有最低级别设置。使用 basicConfig() 配置:

import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("调试信息")
logging.info("普通信息")
logging.warning("警告")

输出:

DEBUG:root:调试信息
INFO:root:普通信息
WARNING:root:警告

level=logging.DEBUG 表示显示 DEBUG 及以上所有级别。可选值:DEBUG, INFO, WARNING, ERROR, CRITICAL。

自定义日志格式

默认格式简单,可添加时间、行号、函数名等。

import logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)
logging.info("程序开始运行")

输出:

2026-01-14 13:30:45,123 - INFO - 程序开始运行

常用格式占位符:

占位符含义
%(asctime)s时间
%(levelname)s日志级别
%(message)s日志内容
%(name)slogger 名称
%(filename)s文件名
%(funcName)s函数名
%(lineno)d行号

详细示例:

format='%(asctime)s - %(name)s - %(funcName)s:%(lineno)d - %(levelname)s - %(message)s'

写入文件

光在控制台看不够,需保存到文件。

方法 1:使用 filename 参数

import logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(message)s',
    filename='my_app.log'
)
logging.info("这条日志会写入文件")

注意:指定 filename 后默认不再输出到控制台。

方法 2:同时输出到文件和控制台

import logging

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

console_handler = logging.StreamHandler()
file_handler = logging.FileHandler('app.log')

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

logger.addHandler(console_handler)
logger.addHandler(file_handler)

logger.info("这条日志会同时出现在控制台和文件中")

这是企业项目中常见的做法。

日志轮转

防止日志文件过大撑爆硬盘,使用 RotatingFileHandler。

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger('my_app')
logger.setLevel(logging.INFO)

handler = RotatingFileHandler(
    'app.log',
    maxBytes=1_000_000,
    backupCount=3
)
handler.setFormatter(logging.Formatter('%(asctime)s - %(message)s'))
logger.addHandler(handler)

for i in range(10000):
    logger.info(f"这是第 {i} 条日志")

当 app.log 超过 1MB,系统会自动重命名旧文件并新建空文件,保留指定数量的备份。

记录异常

程序出错时需记录完整堆栈。

错误做法

try:
    1 / 0
except Exception as e:
    logging.error("出错了:" + str(e))

只有错误信息,缺少堆栈。

正确做法

方法 1:exc_info=True
try:
    1 / 0
except Exception:
    logging.error("发生异常", exc_info=True)

自动附带完整 traceback。

方法 2:logger.exception()
try:
    1 / 0
except Exception:
    logging.exception("发生异常")

等价于 error(..., exc_info=True),仅在 except 块中使用。

最佳实践

大项目中,不同模块应有独立的日志命名空间。

utils/db.py:

import logging
logger = logging.getLogger(__name__)

def connect():
    logger.info("正在连接数据库")

main.py:

import logging
from utils.db import connect

logging.basicConfig(level=logging.INFO)
connect()

好处:可以单独控制某个模块的日志级别。

总结要点

  1. 使用 logging 而非 print,更专业且线程安全。
  2. 五大函数按严重程度选择:debug/info/warning/error/critical。
  3. 用 basicConfig() 快速配置,但只能调用一次。
  4. 格式用 format 参数或 Formatter,推荐包含时间、级别、消息。
  5. 写文件用 FileHandler 或 filename,生产环境必须持久化。
  6. 记录异常用 exc_info=True 或 exception(),否则看不到错误原因。

目录

  1. 认识 logging 模块
  2. 基础用法
  3. 日志级别函数
  4. 设置日志级别
  5. 自定义日志格式
  6. 写入文件
  7. 方法 1:使用 filename 参数
  8. 方法 2:同时输出到文件和控制台
  9. 日志轮转
  10. 记录异常
  11. 错误做法
  12. 正确做法
  13. 方法 1:exc_info=True
  14. 方法 2:logger.exception()
  15. 最佳实践
  16. 总结要点

更多推荐文章

查看全部
  • TDD 实战:如何用测试驱动编写更优的 Python 代码
  • Ubuntu 22.04 部署 FastAPI + Uvicorn + Nginx 生产级 Python Web 服务
  • 使用 Ollama 在本地部署并运行大语言模型
  • 通过 27 个实战挑战精通 Vue.js
  • VS Code C++ 无法跳转函数定义修复指南
  • MCP 插件配置实战:browser-tools-mcp 示例
  • C++ STL 源码解析:基于红黑树实现 map 和 set
  • PyCharm 隐藏实用技巧与常用快捷键指南
  • WebRTC 一对一通话技术详解
  • Aeroscapes 无人机语义分割数据集介绍与数据处理方案
  • Stable Diffusion 3.5-FP8 模型内存交换策略优化建议
  • Neo4j Desktop 2 安装与实战指南
  • 基于 Vivado IP 核的 LVDS 高速通信实现指南
  • 基于优化理论的相位恢复算法
  • 飞书机器人图片消息发送流程与常见报错解决
  • FPGA FIFO IP 核配置与原理详解
  • 全面掌握LIBERO开源机器人学习框架:从入门到实践
  • 基于 Skill 与 MCP 的 Spring AI 应用落地:将业务 SOP 转化为 AI 能力
  • Spring AI 入门与实战:构建生成式 AI 应用
  • 机器人日志系统十年演进:从故障排查到核心数据资产

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online