Основы модуля logging
Настраивайте средства ведения журнала, задавайте уровни и корректно выводите сообщения.
«Основы модуля logging» — бесплатный урок Python Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Почему журналирование лучше print
Модуль logging предоставляет уровни важности, настраиваемые назначения вывода, временные метки и возможность отключать вывод без изменения кода.
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("debug message")
logging.info("info message")
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")Уровни журналирования
Python определяет пять стандартных уровней в порядке возрастания важности: DEBUG, INFO, WARNING, ERROR, CRITICAL. Выводятся только сообщения с уровнем не ниже настроенного.
import logging
# Numeric values:
# DEBUG = 10
# INFO = 20
# WARNING = 30
# ERROR = 40
# CRITICAL = 50
logging.basicConfig(level=logging.WARNING)
logging.debug("hidden") # not shown
logging.warning("shown") # shownПолучение регистратора
Используйте logging.getLogger(__name__) в каждом модуле. Это создаёт иерархию, соответствующую структуре модулей.
import logging
logger = logging.getLogger(__name__)
def process(data):
logger.info("Processing %d items", len(data))
return [x * 2 for x in data]Параметры basicConfig
basicConfig быстро настраивает корневой регистратор. Распространённые именованные аргументы: level, format, filename, filemode.
import logging
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s %(levelname)s %(name)s — %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)Поля формата журнала
Основные поля формата: %(levelname)s, %(name)s, %(message)s, %(asctime)s, %(filename)s, %(lineno)d.
import logging
fmt = "%(asctime)s | %(levelname)-8s | %(name)s:%(lineno)d | %(message)s"
logging.basicConfig(level=logging.DEBUG, format=fmt)
logging.info("Server started on port 8080")Журналирование исключений
Используйте logger.exception() внутри блока except, чтобы записать сообщение AND полную трассировку стека.
import logging
logger = logging.getLogger(__name__)
try:
1 / 0
except ZeroDivisionError:
logger.exception("Division failed")
# Logs message + traceback automaticallyДополнительный контекст с extra=
Передайте словарь в extra=, чтобы добавить пользовательские поля в запись журнала.
import logging
logger = logging.getLogger(__name__)
logging.basicConfig(
format="%(asctime)s %(levelname)s [%(user)s] %(message)s"
)
logger.info("Login successful", extra={"user": "alice"})Отложенное форматирование строк
Передавайте аргументы формата отдельно — не форматируйте строки заранее. Это позволяет избежать затрат на создание строки, если сообщение отфильтровано.
import logging
logger = logging.getLogger(__name__)
# BAD (always builds the string):
logger.debug(f"Processing {len(data)} items")
# GOOD (only builds if DEBUG is enabled):
logger.debug("Processing %d items", len(data))Отключение журналирования
Вызовите logging.disable(level), чтобы глобально подавить все сообщения до указанного уровня включительно — это полезно в тестах.
import logging
logging.disable(logging.CRITICAL) # suppress everything
# All log calls now silently do nothing
logging.disable(logging.NOTSET) # re-enableИерархия регистраторов
Имена регистраторов используют точки как разделители. Дочерние регистраторы передают записи родительским, если propagate=False не установлено.
import logging
parent = logging.getLogger("myapp")
child = logging.getLogger("myapp.database")
# child propagates to parent by default
child.warning("DB slow") # also appears in myapp's handlersКорневой регистратор
Корневой регистратор (из logging.warning() и т. д.) является предком всех регистраторов. Настройте его с помощью basicConfig или добавьте обработчики напрямую.
import logging
root = logging.getLogger() # root logger
root.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
root.addHandler(handler)Проверка
Какой метод журналирования следует использовать внутри блока except, чтобы автоматически включить полную трассировку стека?
Итоги
Используйте именованные регистраторы с getLogger(__name__), настраивайте их через basicConfig, передавайте аргументы формата отложенно, а для трассировок ошибок используйте logger.exception(). Регистраторы образуют иерархию с корневым регистратором во главе.
Часто задаваемые вопросы
Урок «Основы модуля logging» бесплатный?
Да — полный текст урока «Основы модуля logging» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Основы модуля logging»?
Настраивайте средства ведения журнала, задавайте уровни и корректно выводите сообщения. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Основы модуля logging»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы модуля logging
- Обработчики, форматтеры и фильтры
- Структурированное журналирование
- Отладка с помощью pdb