Обработчики, форматтеры и фильтры
Направляйте вывод журнала в файлы, потоки и пользовательские места назначения.
«Обработчики, форматтеры и фильтры» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Основы модуля logging
- Обработчики, форматтеры и фильтры
- Структурированное журналирование
- Отладка с помощью pdb