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

相关推荐
工边页字6 分钟前
AI公司面试100%加分的话题:如何做 API成本预算
前端·后端·面试
sunwenjian8866 分钟前
Spring Boot 整合 Druid 并开启监控
java·spring boot·后端
Java编程爱好者9 分钟前
阿里面试官:什么才是可工程化落地的RAG项目
后端
weixin_3077791310 分钟前
2025年中国研究生数学建模竞赛A题:通用神经网络处理器下的核内调度问题——解决方案与实现
开发语言·人工智能·python·数学建模·性能优化
2501_9249526912 分钟前
Python深度学习入门:TensorFlow 2.0/Keras实战
jvm·数据库·python
skiy13 分钟前
Spring boot创建时常用的依赖
java·spring boot·后端
2401_8914821714 分钟前
Python多线程与多进程:如何选择?(GIL全局解释器锁详解)
jvm·数据库·python
2401_8512729915 分钟前
用Python实现自动化的Web测试(Selenium)
jvm·数据库·python
后端不背锅16 分钟前
事件驱动架构:异步解耦的最佳实践
后端