0Pricing
Python Academy · Урок

Обработчики, форматтеры и фильтры

Направляйте вывод журнала в файлы, потоки и пользовательские места назначения.

«Обработчики, форматтеры и фильтры» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения 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 для ротации по датам.

Часто задаваемые вопросы

Урок «Обработчики, форматтеры и фильтры» бесплатный?

Да — полный текст урока «Обработчики, форматтеры и фильтры» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Обработчики, форматтеры и фильтры»?

Направляйте вывод журнала в файлы, потоки и пользовательские места назначения. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Обработчики, форматтеры и фильтры»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы модуля logging
  2. Обработчики, форматтеры и фильтры
  3. Структурированное журналирование
  4. Отладка с помощью pdb
← Назад к Python Academy