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工程化思维的体现:可控、可分析、可复盘。

相关推荐
测试19982 小时前
软件测试 - 单元测试总结
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
Mahir084 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
曲幽4 小时前
我用了FastApiAdmin后,连夜把踩过的坑都整理出来了
redis·python·postgresql·vue3·fastapi·web·sqlalchemy·admin·fastapiadmin
前端若水6 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
涛声依旧-底层原理研究所6 小时前
残差连接与层归一化通俗易懂的详解
人工智能·python·神经网络·transformer
csdn_aspnet7 小时前
Python 算法快闪 LeetCode 编号 70 - 爬楼梯
python·算法·leetcode·职场和发展
fantasy_arch7 小时前
pytorch人脸匹配模型
人工智能·pytorch·python
熊猫_豆豆7 小时前
广义相对论水星近日点进动完整详细数学推导
python·天体·广义相对论
web3.08889997 小时前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python
AI算法沐枫8 小时前
深度学习python代码处理科研测序数据
数据结构·人工智能·python·深度学习·决策树·机器学习·线性回归