Python使用logging搭建工程级日志系统的最佳实践

 更新时间:2026年07月12日 08:37:22   作者:前端阿凡  
想快速从print升级到专业Python日志管理?本文带你掌握logging五大组件,涵盖分级控制、文件轮转、按模块分层和JSON格式输出,学会这些实用技巧和避坑指南,轻松搭建日志系统,有效排查生产环境问题,需要的朋友可以参考下

1. 为什么不用 print?

生产环境需要日志分级、持久化、格式化控制。print 一梭子下去,排查问题时两眼一抹黑。

2. 快速入门:logging 五大组件

组件职责
Logger日志入口,分等级
Handler输出目的地(文件、终端、网络)
Formatter格式化输出样式
Filter按条件过滤
LevelDEBUG → INFO → WARNING → ERROR → CRITICAL

3. 一行配置,即插即用

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)  # 自动打印堆栈

4. 实用技巧:日志轮转

文件无限增大会撑爆磁盘,用 RotatingFileHandler 自动切割:

from logging.handlers import RotatingFileHandler

handler = 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"
))

5. 按模块化分层

大型项目不要全局一把梭,每个模块独立 Logger:

# utils/db.py
logger = logging.getLogger("app.db")

# utils/http.py
logger = logging.getLogger("app.http")

配合 logging.getLogger("app") 统一配置,子 Logger 继承父配置,省心。

6. 高级:JSON 日志(对接 ELK / 日志平台)

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)

7. 避坑指南

正确做法
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"))

8. 开箱即用的模板

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 格式 + JSON 收集至 ELK/Loki

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

以上就是Python使用logging搭建工程级日志系统的最佳实践的详细内容,更多关于Python logging搭建工程级日志系统的资料请关注脚本之家其它相关文章!

相关文章

  • 使用python批量读取word文档并整理关键信息到excel表格的实例

    使用python批量读取word文档并整理关键信息到excel表格的实例

    今天小编就为大家分享一篇使用python批量读取word文档并整理关键信息到excel表格的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python模拟HTTP请求实现APP自动签到功能

    Python模拟HTTP请求实现APP自动签到功能

    在现代移动互联网应用中,许多APP都设有每日签到功能,用户通过签到可以获得积分、优惠券或其他奖励,本文将详细介绍如何通过 Python模拟HTTP请求 实现APP自动签到,并提供完整的代码实现,需要的朋友可以参考下
    2025-08-08
  • Python实现的KMeans聚类算法实例分析

    Python实现的KMeans聚类算法实例分析

    这篇文章主要介绍了Python实现的KMeans聚类算法,结合实例形式较为详细的分析了KMeans聚类算法概念、原理、定义及使用相关操作技巧,需要的朋友可以参考下
    2018-12-12
  • Python实现栈和队列的简单操作方法示例

    Python实现栈和队列的简单操作方法示例

    这篇文章主要介绍了Python实现栈和队列的简单操作方法,结合实例形式详细分析了Python栈和队列的原理与简单实现技巧,需要的朋友可以参考下
    2019-11-11
  • Python+PyQt5打造一个Excel批量列处理工具

    Python+PyQt5打造一个Excel批量列处理工具

    在日常的办公中,我们经常会遇到需要批量处理Excel文件的情况,今天我们就用 Python + PyQt5 + Pandas 打造一款图形化的Excel批量列处理工具,不仅支持一键拖拽文件,还能动态选择列名、添加多条处理规则,帮你彻底告别重复劳动
    2026-04-04
  • 简单实现python进度条脚本

    简单实现python进度条脚本

    这篇文章主要教大家如何简单实现python进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 如何理解Python中的变量

    如何理解Python中的变量

    在本篇文章里小编给大家分享的是关于Python中变量是什么意思的相关基础知识点,需要的朋友们可以学习下。
    2020-06-06
  • 使用Python拆分与合并Excel文档的操作指南

    使用Python拆分与合并Excel文档的操作指南

    在日常工作中,Excel电子表格无疑是最常用的数据处理工具之一,然而,当面对大量需要拆分或合并的Excel文件时,手动操作不仅耗时耗力,还极易出错,Python作为一款强大的编程语言,可以帮助我们轻松实现Excel文件的自动化处理,本文将为您详细介绍如何使用Python拆分与合并
    2025-09-09
  • Python系统监控之跨平台检查系统服务运行状态的完整指南

    Python系统监控之跨平台检查系统服务运行状态的完整指南

    系统服务是操作系统和应用程序正常运行的基础,本文将和大家分享一个系统服务状态检查的Python实用脚本,可以跨平台检查系统服务的运行状态,并提供详细的报告和告警功能,有需要的可以参考下
    2025-12-12
  • python用Pygal如何生成漂亮的SVG图像详解

    python用Pygal如何生成漂亮的SVG图像详解

    本篇文章讲述python如何用 Pygal 来生成漂亮的 SVG 图表,并能够利用 Python 中的 Flask 框架来显示你的 SVG 图像,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02

最新评论