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

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
大勇前进3 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端