处理器、格式化器与过滤器
将日志输出路由到文件、流和自定义目标。
处理器、格式化器与过滤器 是 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 反馈 — 无需本地设置。
此课程中的所有课时
- logging 模块基础
- 处理器、格式化器与过滤器
- 结构化日志记录
- 使用 pdb 调试