一、为什么要用 logging 代替 print?

新手开发习惯用 print() 输出信息,但在正式项目中print 完全不适用

print 无法区分 错误、警告、普通信息 等级

print 无时间、无代码行号,无法定位报错位置

print 只能打印控制台,无法保存到文件

无法灵活控制日志开关、过滤日志级别

logging 优势:分级输出、自定义格式、自动保存文件、可扩展多处理器,是 Python 项目日志标准方案。

二、logging 五大日志等级(由低到高)

logging 内置 5 种常用日志级别,级别越高越严重。默认只输出 WARNING 及以上 日志。

等级

数值

用途场景

DEBUG

10

详细调试信息,开发阶段使用

INFO

20

普通运行信息,记录程序正常流程

WARNING

30

警告信息,程序不报错但存在风险

ERROR

40

功能报错,单个逻辑失败

CRITICAL

50

严重错误,程序无法继续运行

基础使用案例

import logging

logging.debug("这是DEBUG调试信息")
logging.info("这是INFO正常信息")
logging.warning("这是WARNING警告信息")
logging.error("这是ERROR错误信息")
logging.critical("这是CRITICAL严重错误")

默认仅输出 warning、error、critical,低级别日志会被过滤。

三、自定义日志格式(核心重点)

默认日志格式非常简陋,无法定位问题。我们可以通过 format 格式化字符串 自定义日志输出内容。

常用日志格式占位符

%(asctime)s:日志打印时间

%(levelname)s:日志级别名称

%(filename)s:当前执行文件名

%(lineno)d:代码行号

%(message)s:日志主体信息

标准企业级日志格式配置

import logging

# 配置日志基础设置
logging.basicConfig(
    level=logging.DEBUG,  # 设置最低输出级别
    format="%(asctime)s | %(levelname)s | %(filename)s[line:%(lineno)d] | %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)

# 测试输出
logging.debug("调试日志:参数加载完成")
logging.info("正常日志:程序启动成功")
logging.warning("警告日志:内存占用偏高")
logging.error("错误日志:接口请求失败")

配置后日志自带:时间 + 级别 + 文件名 + 行号 + 信息,排查问题极其方便。

四、日志处理器 Handler 详解

basicConfig 适合简单脚本,企业级项目必须使用 Logger + Handler 处理器

Handler 作用:控制日志的输出去向

两种最常用处理器:

  1. StreamHandler:控制台输出处理器(打印到终端)

  2. FileHandler:文件输出处理器(保存日志到本地文件)

4.1 日志组件四大核心角色

Logger(日志器):对外提供 debug/info/error 方法,程序入口

Handler(处理器):决定日志输出到哪里(控制台/文件)

Formatter(格式器):决定日志输出格式

Filter(过滤器):可选,过滤指定日志

五、实战案例

1:控制台处理器 StreamHandler

import logging

# 1. 创建日志器
logger = logging.getLogger("test_log")
logger.setLevel(logging.DEBUG)  # 全局最低级别

# 2. 创建日志格式
formatter = logging.Formatter(
    "%Y-%m-%d %H:%M:%S | %(levelname)s | %(filename)s:%(lineno)d | %(message)s"
)

# 3. 创建控制台处理器
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)

# 4. 处理器绑定到日志器
logger.addHandler(stream_handler)

# 测试
logger.info("控制台日志输出成功")
logger.error("模拟程序报错")

2:文件处理器 FileHandler(日志持久化)

将所有日志自动保存到本地 log 文件,用于后续排查线上问题。

import logging

# 1. 日志器
logger = logging.getLogger("file_log")
logger.setLevel(logging.DEBUG)

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

# 3. 文件处理器
file_handler = logging.FileHandler("run.log", encoding="utf-8")
file_handler.setFormatter(formatter)

# 4. 绑定
logger.addHandler(file_handler)

# 写入日志
logger.info("程序开始运行")
logger.warning("检测到非关键参数缺失")
logger.error("数据库连接超时")

运行后自动生成 run.log 文件,所有日志永久保存。

3:企业级终极方案:双处理器(控制台+文件同时输出)

开发时控制台看日志,运行时自动存文件,一套配置全覆盖!

import logging

# 1. 初始化日志器
logger = logging.getLogger("my_project_log")
logger.setLevel(logging.DEBUG)
# 防止重复打印
logger.handlers.clear()

# 2. 统一日志格式
formatter = logging.Formatter(
    "%(asctime)s | %(levelname)-8s | %(filename)s[%(lineno)d] | %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)

# 3. 控制台处理器
sh = logging.StreamHandler()
sh.setFormatter(formatter)

# 4. 文件处理器
fh = logging.FileHandler("app.log", encoding="utf-8")
fh.setFormatter(formatter)

# 5. 添加双处理器
logger.addHandler(sh)
logger.addHandler(fh)

# 测试
logger.debug("调试信息:参数初始化完成")
logger.info("项目启动成功")
logger.warning("请求频次较高")
logger.error("接口调用异常")

六、常见坑点总结

坑1:设置级别无效 → 忘记给 logger 设置 Level

坑2:日志重复打印 → 多次 addHandler,需 logger.handlers.clear()

坑3:日志文件乱码 → FileHandler 指定 encoding="utf-8"

坑4:debug 日志不输出 → 默认级别为 WARNING,需手动调低

七、全文总结

  1. logging 是 Python 标准日志库,替代 print,适合所有正式项目;

  2. 五大日志等级:DEBUG < INFO < WARNING < ERROR < CRITICAL;

  3. 日志格式 Formatter 可以自定义时间、行号、文件、信息;

  4. Handler 处理器决定日志输出位置:控制台 / 文件;

  5. 企业级标配:双处理器同时输出控制台+文件日志

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐