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

相关推荐
爱隐身的官人12 分钟前
cfshow-web入门-php特性
python·php·ctf
gb421528732 分钟前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
THMAIL36 分钟前
量化股票从贫穷到财务自由之路 - 零基础搭建Python量化环境:Anaconda、Jupyter实战指南
linux·人工智能·python·深度学习·机器学习·金融
~-~%%37 分钟前
从PyTorch到ONNX:模型部署性能提升
人工智能·pytorch·python
蒋星熠43 分钟前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
ChinaRainbowSea1 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
舒一笑1 小时前
同步框架与底层消费机制解决方案梳理
后端·程序员
minh_coo1 小时前
Spring框架事件驱动架构核心注解之@EventListener
java·后端·spring·架构·intellij-idea
爬虫程序猿1 小时前
《京东商品详情爬取实战指南》
爬虫·python
胡耀超1 小时前
4、Python面向对象编程与模块化设计
开发语言·python·ai·大模型·conda·anaconda