13、你还在 print 调试🧾?教你写出自己的日志系统

😵 print() 调试虽然方便,但混在生产代码里简直灾难。 今天教你用 Python 的 logging 模块写一个可控、可分级、可记录文件的日志系统,干净又专业!


✅ 本文目标

  • 理解 logging 模块的等级体系
  • 实现控制台 + 文件双通道日志记录
  • 使用格式化输出 + 时间戳
  • 在项目中封装一个通用日志器

📦 一、什么是 logging 模块?

Python 自带的 logging 是标准日志库,可以:

功能 用途
分级别日志(DEBUG/INFO/WARNING/ERROR/CRITICAL) 适配开发、测试、线上
控制输出位置(console、文件、远程服务器) 多场景支持
支持时间戳、格式模板、模块名等丰富信息 有利于排查问题

🧪 二、最基础的用法:只打 INFO 级别以上

python 复制代码
import logging

logging.basicConfig(level=logging.INFO)
logging.info("程序启动")
logging.debug("调试信息")  # 默认不会打印
logging.warning("这是个警告")
logging.error("出现了错误")

输出:


🎯 三、自定义日志格式 + 写入文件

python 复制代码
import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s | %(levelname)s | %(message)s",
    filename="log.txt",
    filemode="a",  # 追加模式
    encoding="utf-8"
)

logging.info("启动任务")
logging.error("失败了但我不慌")

输出到 log.txt


🔧 四、同时输出到控制台 + 文件(进阶推荐)

python 复制代码
import logging

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

# 控制台输出
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)

# 文件输出
file_handler = logging.FileHandler("run.log", encoding="utf-8")
file_handler.setLevel(logging.DEBUG)

# 日志格式
formatter = logging.Formatter(
    fmt="%(asctime)s | %(levelname)s | %(name)s | %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)

console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

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

使用:

python 复制代码
logger.info("程序启动")
logger.debug("这个 debug 只写入文件")
logger.error("严重错误")

🧰 五、封装成可复用模块 logger.py

python 复制代码
# logger.py
import logging

def get_logger(name="app", logfile="app.log"):
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)

    if not logger.handlers:
        formatter = logging.Formatter(
            "%(asctime)s | %(levelname)s | %(name)s | %(message)s",
            datefmt="%Y-%m-%d %H:%M:%S"
        )

        ch = logging.StreamHandler()
        ch.setLevel(logging.INFO)
        ch.setFormatter(formatter)

        fh = logging.FileHandler(logfile, encoding="utf-8")
        fh.setLevel(logging.DEBUG)
        fh.setFormatter(formatter)

        logger.addHandler(ch)
        logger.addHandler(fh)

    return logger

使用方式:

python 复制代码
# main.py
from logger import get_logger

log = get_logger("spider")

log.info("开始爬虫任务")
log.warning("页面结构有变")
log.debug("内部状态 x=42")
log.error("请求失败,重试中")

💡 BONUS:结合异常 + 日志

python 复制代码
try:
    1 / 0
except Exception as e:
    log.exception("❌ 除法出错了")

输出自动带有完整异常堆栈。

🧠 总结一句话

print() 只属于临时调试,而 logging工程化思维的体现:可控、可分析、可复盘。

相关推荐
2***d8855 小时前
SpringBoot 集成 Activiti 7 工作流引擎
java·spring boot·后端
五阿哥永琪5 小时前
Spring中的定时任务怎么用?
java·后端·spring
追逐时光者5 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 65 期(2026年1.1-1.11)
后端·.net
计算机毕设VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
gelald5 小时前
AQS 工具之 CountDownLatch 与 CyclicBarry 学习笔记
java·后端·源码阅读
且去填词5 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
知乎的哥廷根数学学派5 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习
q***o3765 小时前
Spring Boot环境配置
java·spring boot·后端
hhzz5 小时前
Springboot项目中使用POI操作Excel(详细教程系列3/3)
spring boot·后端·excel·poi·easypoi
WangYaolove13145 小时前
Python基于大数据的电影市场预测分析(源码+文档)
python·django·毕业设计·源码