0Pricing
Python Academy · 课时

处理器、格式化器与过滤器

将日志输出路由到文件、流和自定义目标。

处理器、格式化器与过滤器 是 CoddyKit 上的免费 Python Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。

处理器负责路由日志记录

处理器 会将日志记录发送到某个目标:控制台、文件、HTTP 端点等。一个日志记录器可以拥有多个处理器。

import logging

logger = logging.getLogger("myapp")
logger.setLevel(logging.DEBUG)

sh = logging.StreamHandler()
logger.addHandler(sh)

logger.info("Goes to console")

StreamHandler

StreamHandler 会写入流(默认是 sys.stderr)。传入 sys.stdout 即可输出到 stdout。

import logging, sys

logger = logging.getLogger("out")
handler = logging.StreamHandler(sys.stdout)
logger.addHandler(handler)
logger.warning("printed to stdout")

FileHandler

FileHandler 会将记录追加到文件中。使用 mode="w" 可在每次运行时覆盖文件内容。

import logging

logging.basicConfig(
    filename="app.log",
    filemode="a",
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s"
)
logging.info("Persisted to disk")

RotatingFileHandler

当日志文件超过大小限制时自动进行轮换,同时保留 N 个备份文件。

from logging.handlers import RotatingFileHandler
import logging

handler = RotatingFileHandler(
    "app.log", maxBytes=1_000_000, backupCount=5
)
logging.getLogger().addHandler(handler)

TimedRotatingFileHandler

按照时间计划轮换日志文件,例如每天、每周或每小时一次,非常适合长时间运行的服务。

from logging.handlers import TimedRotatingFileHandler
import logging

handler = TimedRotatingFileHandler(
    "app.log", when="midnight", backupCount=7
)
logging.getLogger().addHandler(handler)

格式化器

Formatter 控制每条日志记录的文本布局。使用 handler.setFormatter() 将其附加到处理器上。

import logging

fmt = logging.Formatter(
    fmt="%(asctime)s %(levelname)-8s %(name)s — %(message)s",
    datefmt="%Y-%m-%dT%H:%M:%S"
)
handler = logging.StreamHandler()
handler.setFormatter(fmt)
logging.getLogger().addHandler(handler)

处理器级过滤

每个处理器都有自己的级别。一条记录必须同时通过日志记录器级别和处理器级别,才会被输出。

import logging

logger = logging.getLogger("app")
logger.setLevel(logging.DEBUG)   # logger passes DEBUG+

err_handler = logging.FileHandler("errors.log")
err_handler.setLevel(logging.ERROR)  # only ERROR+
logger.addHandler(err_handler)

自定义过滤器

继承 logging.Filter 并重写 filter(record),即可根据任意条件接受或拒绝记录。

import logging

class SensitiveFilter(logging.Filter):
    def filter(self, record):
        return "password" not in record.getMessage().lower()

handler = logging.StreamHandler()
handler.addFilter(SensitiveFilter())
logging.getLogger().addHandler(handler)

使用过滤器添加额外字段

过滤器还可以修改记录,在格式化之前注入额外字段(例如请求 ID)。

import logging

class RequestIDFilter(logging.Filter):
    def __init__(self, request_id):
        self.request_id = request_id
    def filter(self, record):
        record.request_id = self.request_id
        return True

# fmt: "%(request_id)s %(message)s"

一个日志记录器上的多个处理器

添加多个处理器,即可同时将相同的日志记录发送到多个目标。

import logging

logger = logging.getLogger("multi")
logger.addHandler(logging.StreamHandler())             # console
logger.addHandler(logging.FileHandler("audit.log"))   # file
logger.setLevel(logging.INFO)
logger.info("Both destinations receive this")

禁用传播

设置 logger.propagate = False,即可阻止记录向上传递到根日志记录器,避免重复记录。

import logging

logger = logging.getLogger("mylib")
logger.propagate = False   # stays here, does not reach root
logger.addHandler(logging.StreamHandler())

快速检查

使用哪个方法将 Formatter 附加到 Handler?

回顾

处理器负责路由记录,格式化器负责设置记录样式,过滤器则选择性地传递或阻止记录。使用 RotatingFileHandler 处理受大小限制的日志,使用 TimedRotatingFileHandler 按日期轮换日志。

常见问题解答

「处理器、格式化器与过滤器」课时是免费的吗?

是的 — 「处理器、格式化器与过滤器」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。

「处理器、格式化器与过滤器」这节课中我会学到什么?

将日志输出路由到文件、流和自定义目标。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Python Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「处理器、格式化器与过滤器」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Python Academy 课中编写并运行代码吗?

能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. logging 模块基础
  2. 处理器、格式化器与过滤器
  3. 结构化日志记录
  4. 使用 pdb 调试
← 返回 Python Academy