当前位置:

首页 > 编程开发 > Python 开发技巧 · logging 最佳实践 —— 告别 print,搭建工程级日志系统

Python 开发技巧 · logging 最佳实践 —— 告别 print,搭建工程级日志系统

告别 print,用 logging 搭建工程级日志系统 在 Python 开发中,日志系统的重要性不言而喻。但很多开发者,尤其是刚入门的同学,习惯了用print一把梭——调试时满屏输出,上线后却两眼一抹黑。生产环境下的日志,关键在于分级、持久化、格式化控制,而这些恰恰是print给不了的。那么,该

告别 print,用 logging 搭建工程级日志系统

在 Python 开发中,日志系统的重要性不言而喻。但很多开发者,尤其是刚入门的同学,习惯了用print一把梭——调试时满屏输出,上线后却两眼一抹黑。生产环境下的日志,关键在于分级、持久化、格式化控制,而这些恰恰是print给不了的。那么,该怎么搭建一套像样的日志系统呢?

Python 开发技巧 · logging 最佳实践 —— 告别 print,搭建工程级日志系统

快速入门:logging 五大组件

Python 标准库的 logging 模块,本质上是一套组件化的日志框架。理解它的五大组件,是掌握日志系统的第一步。

组件职责
Logger日志入口,分级控制
Handler输出目的地,比如文件、终端、网络
Formatter格式化输出样式
Filter按条件过滤日志
Level日志级别:DEBUG → INFO → WARNING → ERROR → CRITICAL

简单来说,Logger 负责发出消息,Handler 决定把消息送到哪里,Formatter 决定消息长什么样,Filter 决定消息能不能发出去,Level 则决定消息的优先级。

最简配置,一行代码搞定

如果你只是想快速用起来,basicConfig 是最直接的方式:

 复制代码import logging# 最简配置(同时输出到终端和文件)
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
    handlers=[
        logging.StreamHandler(),                    # 终端
        logging.FileHandler("app.log", encoding="utf-8"),  # 文件
    ],
)log = logging.getLogger(__name__)log.info("服务启动成功")
log.warning("磁盘使用率超过 80%%")
log.error("数据库连接超时", exc_info=True)  # 自动打印堆栈

注意,exc_info=True 这个参数很实用,当发生异常时,它会自动把完整的堆栈信息打印出来,省去了手动 traceback 的麻烦。

实用技巧:日志轮转,避免磁盘爆炸

日志文件无限增长,迟早会撑爆磁盘。这时候,RotatingFileHandler 就派上用场了:

 复制代码from logging.handlers import RotatingFileHandlerhandler = RotatingFileHandler(
    "app.log",
    maxBytes=10 * 1024 * 1024,  # 10MB
    backupCount=5,              # 保留 5 个备份
    encoding="utf-8",
)
handler.setFormatter(logging.Formatter(
    "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
))

当单个日志文件达到 10MB 时,会自动切割,并保留最近 5 个备份。这样既不会丢失历史日志,也不会让磁盘空间持续告急。

按模块化分层,大型项目必备

在大型项目中,千万不要全局一把梭。每个模块应该拥有独立的 Logger:

 复制代码# utils/db.py
logger = logging.getLogger("app.db")# utils/http.py
logger = logging.getLogger("app.http")

配合 logging.getLogger("app") 统一配置,子 Logger 会自动继承父配置,省心省力。这种方式的好处是,当某个模块出问题时,你能快速定位到是哪个模块的日志,而不必在一堆混杂的输出中大海捞针。

高级:JSON 日志,对接 ELK 平台

如果项目规模再大一些,需要对接 ELK、Loki 等日志收集平台,那 JSON 格式的日志就是最佳选择。它可以被结构化的解析,方便后续的搜索和分析。

 复制代码import json
import logging
class JsonFormatter(logging.Formatter):
    def format(self, record: logging.LogRecord) -> str:
        log_obj = {
            "time": self.formatTime(record, self.datefmt),
            "level": record.levelname,
            "logger": record.name,
            "message": record.getMessage(),
        }
        if record.exc_info and record.exc_info[0]:
            log_obj["exception"] = self.formatException(record.exc_info)
        return json.dumps(log_obj, ensure_ascii=False)

避坑指南,这些坑你踩过吗?

坑正确做法
logger = logging.getLogger() 空参用 __name__,方便定位模块
f"user={user}" 占位符用 f-string用 "user=%s" % user 惰性求值,避免不必要开销
重复添加 Handler(多次调用 basicConfig)使用 not logger.handlers 判空,或用单例
中文乱码FileHandler 加上 encoding="utf-8"
生产环境打印 DEBUG 日志用环境变量控制级别:level=getattr(logging, os.getenv("LOG_LEVEL", "INFO"))

这里特别想提一下占位符的问题。很多开发者习惯用 f-string 来拼接日志字符串,比如 f"user={user}"。但这样做的问题是,无论日志级别如何,都会先进行字符串格式化,浪费性能。而 "user=%s" % user 这种写法,只有在日志级别被触发时,才会进行格式化,这就是惰性求值的优势。

开箱即用的模板

说了这么多,最后直接给一个可以直接复制使用的配置函数:

 复制代码import logging
import logging.handlers
import sys
from pathlib import Path
def setup_logger(
    name: str = __name__,
    level: str = "INFO",
    log_file: str | None = None,
) -> logging.Logger:
    logger = logging.getLogger(name)
    if logger.handlers:
        return logger  # 防止重复添加    logger.setLevel(getattr(logging, level.upper(), logging.INFO))    fmt = logging.Formatter(
        "%(asctime)s [%(levelname)s] %(name)s:%(lineno)d: %(message)s"
    )    # 终端 Handler(始终输出 >= WARNING)
    console = logging.StreamHandler(sys.stdout)
    console.setLevel(logging.WARNING)
    console.setFormatter(fmt)
    logger.addHandler(console)    # 文件 Handler 带轮转(输出全部级别)
    if log_file:
        Path(log_file).parent.mkdir(parents=True, exist_ok=True)
        handler = logging.handlers.RotatingFileHandler(
            log_file, maxBytes=10 << 20, backupCount=5, encoding="utf-8"
        )
        handler.setLevel(logging.DEBUG)
        handler.setFormatter(fmt)
        logger.addHandler(handler)    return logger
# 使用
log = setup_logger("my_app", level="DEBUG", log_file="logs/my_app.log")
log.info(" Logger 初始化完成")

小结

  • 小脚本:logging.basicConfig 一行搞定
  • 中型项目:模块化 Logger + 文件轮转
  • 大型/微服务:JSON 格式 + 收集至 ELK/Loki

从现在开始,所有 Python 项目都值得用 logging 替代 print,这是专业开发者与新手的分水岭。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 Python
相关文章 更多
大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

langgraph python guide中文入门教程详解
langgraph python guide中文入门教程详解

本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

Windows 安装 Python:从官方入口到虚拟环境的可复现实践
Windows 安装 Python:从官方入口到虚拟环境的可复现实践

面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

Windows系统Python安装教程:下载、勾选PATH及环境变量配置
Windows系统Python安装教程:下载、勾选PATH及环境变量配置

针对Windows初学者的Python安装实战指南。详细讲解如何从Python官网下载匹配架构的安装包,重点演示安装首屏勾选“Add python.exe to PATH”的关键操作,并提供使用python --version和py命令验证环境变量的具体步骤,帮助新手快速搭建开发环境并排查路径问题。

Python安装后怎么打开:使用IDLE或命令行启动解释器
Python安装后怎么打开:使用IDLE或命令行启动解释器

刚在Windows安装好Python却不知道如何启动?本文详细演示如何通过开始菜单找到并打开IDLE集成开发环境,以及如何在PowerShell或命令提示符中使用python和py命令启动交互式解释器、运行.py脚本文件。包含退出解释器的方法及常见启动问题排查,帮助初学者快速验证安装成功并开始编写代码。

了解Python编程领域中最好的就业行业
了解Python编程领域中最好的就业行业

了解Python编程领域中最好的就业行业导语:近年来,Python作为一种易学易用的编程语言,越来越受到企业和开发者的青睐。在Python编程领域中,有许多就业机会,涵盖了各个行业。本文将介绍一些Python编程领域中最好的就业行业,并提供相应的代码示例。数据科学和机器学习数据科学和机器学习是Python编程领域中最热门的行业之一。Python在数据科学和机

python处理csv文件的方法完整实用教程
python处理csv文件的方法完整实用教程

针对Python处理CSV文件时常见的编码报错、内存溢出和数据类型错误,本文对比标准库csv与Pandas库的适用场景,提供可复制的代码示例和因果排查思路,帮助开发者选择最优处理方案。

python字典怎么按值排序用sorted函数实现升降序
python字典怎么按值排序用sorted函数实现升降序

本文介绍如何使用Python的sorted函数对字典按值进行升序和降序排序,结合具体代码示例和应用场景,帮助读者理解排序逻辑及其在数据处理中的实际价值。

python正则匹配修改方法与代码实现教程
python正则匹配修改方法与代码实现教程

深入讲解Python中使用re.sub进行正则匹配与替换的技巧,涵盖基础语法、分组引用及回调函数应用,帮助开发者解决复杂字符串修改需求,提升代码效率与可维护性。

selenium中文安装包下载与安装教程
selenium中文安装包下载与安装教程

详解Selenium在Python环境下的安装步骤,包括使用pip安装库文件、下载对应版本的浏览器驱动以及验证安装是否成功,适合自动化测试初学者参考。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
IntelliJ IDEA macOS版
IntelliJ IDEA macOS版
Mac

IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

PyCharm macOS版
PyCharm macOS版
Mac

JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

WebStorm macOS版
WebStorm macOS版
Mac

JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

WINDOWS 更多
IntelliJ IDEA Windows版
IntelliJ IDEA Windows版
Windows

JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

PhpStorm Windows版
PhpStorm Windows版
Windows

PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

PyCharm Windows版
PyCharm Windows版
Windows

PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,