Программирование с ИИ
ENRU
4.2

Запуск и чтение логов

что программа рассказывает о себе

Что это

Лог — это то, что программа пишет о себе, пока работает. Для отладки он важнее трейсбека: трейсбек показывает момент падения, а лог — что происходило до того.

Для бота или сервера лог вообще единственный способ узнать, что случилось: ты не видишь экрана пользователя и не можешь переспросить.

Как выглядит в коде

import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(name)s: %(message)s",
)
log = logging.getLogger(__name__)


def fetch_weather(city: str) -> dict:
    log.info("запрос погоды: %s", city)
    try:
        data = call_api(city)
    except TimeoutError:
        log.warning("таймаут для города %s, повторяю", city)
        data = call_api(city)
    log.debug("ответ API: %s", data)
    return data

Вывод:

измерено
2026-10-14 13:02:11 INFO handlers.weather: запрос погоды: Oslo
2026-10-14 13:02:12 WARNING handlers.weather: таймаут для города Oslo, повторяю

Пять уровней

УровеньКогдаВидно по умолчанию
DEBUGподробности для отладкинет
INFOнормальный ход работыда
WARNINGстранно, но работаем дальшеда
ERRORне получилось сделать то, что просилида
CRITICALдальше работать нельзяда

Строка level=logging.INFO означает: показывать INFO и всё, что серьёзнее. Чтобы увидеть DEBUG, уровень меняют на logging.DEBUG — обычно временно, на время поиска ошибки.

Как читать лог

Снизу вверх, до первой неожиданности. Последние строки — следствия, интересное обычно выше.

Смотри на время. Разрыв в несколько секунд между соседними строками показывает, где программа ждала. Это самый дешёвый способ понять, что тормозит.

Ищи WARNING перед ERROR. Предупреждение часто называет настоящую причину, а ошибка — лишь её следствие.

Считай повторы. Одна и та же строка сто раз подряд — цикл, который не должен был зациклиться, или повторные попытки, которые не кончаются.

printlogging
в одном скрипте, пока отлаживаешьв боте, сервере, всём, что работает долго
исчезает, когда программа не в терминалепишется в файл, остаётся после перезапуска
нет уровней и времениуровни, время, имя модуля

Правило: пока ищешь ошибку руками — print (статья 4.5). Всё, что остаётся в коде, — logging.

Как сказать ИИ

Запрос
Добавь логирование в эту функцию: INFO на входе с ключевыми
аргументами, WARNING на нештатные ситуации, ERROR на отказ.
Токены и персональные данные в лог не пиши.

Когда лог уже есть и надо разобраться:

Запрос
Вот кусок лога. Что здесь произошло? На что обратить
внимание в первую очередь?

<лог>

Когда логов не хватает:

Запрос
Я не понимаю, почему эта функция возвращает пустой список.
Куда добавить логирование, чтобы это стало видно?
Минимум строк.

На что смотреть

Секреты в логах. Токен или пароль, записанный в лог, — это тот же секрет в открытом виде, только в файле, который потом пересылают. Проверяй, что логируется, прежде чем отдавать лог кому-то, включая ИИ.

Лог, в котором нет ничего. Если при ошибке в логе пусто, значит, логировать забыли — и единственный способ узнать причину уже потерян.

Лог, в котором всё. Обратная крайность: DEBUG на всё подряд в рабочем режиме. Файл растёт, важное тонет, диск кончается.

Сообщение без данных. log.error("ошибка") не говорит ничего. Хорошая запись содержит значения: какой город, какой пользователь, какой код ответа.

Логирование внутри цикла по тысяче элементов. Тысяча строк на один запрос. Логируй итог, а не каждый шаг.

Шпаргалка

  • Лог важнее трейсбека: показывает, что было до падения.

  • Пять уровней: DEBUG · INFO · WARNING · ERROR · CRITICAL.

  • Читай снизу вверх до первой неожиданности, смотри на разрывы во времени.

  • WARNING перед ERROR часто и есть настоящая причина.

  • print — пока отлаживаешь, logging — всё, что остаётся в коде.

  • В сообщении всегда указывай значения. Секреты не логируй.