Запуск и чтение логов
что программа рассказывает о себе
Что это
Лог — это то, что программа пишет о себе, пока работает. Для отладки он важнее трейсбека: трейсбек показывает момент падения, а лог — что происходило до того.
Для бота или сервера лог вообще единственный способ узнать, что случилось: ты не видишь экрана пользователя и не можешь переспросить.
Как выглядит в коде
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. Предупреждение часто называет настоящую
причину, а ошибка — лишь её следствие.
Считай повторы. Одна и та же строка сто раз подряд — цикл, который не должен был зациклиться, или повторные попытки, которые не кончаются.
print или logging
print | logging |
|---|---|
| в одном скрипте, пока отлаживаешь | в боте, сервере, всём, что работает долго |
| исчезает, когда программа не в терминале | пишется в файл, остаётся после перезапуска |
| нет уровней и времени | уровни, время, имя модуля |
Правило: пока ищешь ошибку руками — print (статья 4.5). Всё, что остаётся в
коде, — logging.
Как сказать ИИ
Добавь логирование в эту функцию: INFO на входе с ключевыми
аргументами, WARNING на нештатные ситуации, ERROR на отказ.
Токены и персональные данные в лог не пиши.Когда лог уже есть и надо разобраться:
Вот кусок лога. Что здесь произошло? На что обратить
внимание в первую очередь?
<лог>Когда логов не хватает:
Я не понимаю, почему эта функция возвращает пустой список.
Куда добавить логирование, чтобы это стало видно?
Минимум строк.На что смотреть
Секреты в логах. Токен или пароль, записанный в лог, — это тот же секрет в открытом виде, только в файле, который потом пересылают. Проверяй, что логируется, прежде чем отдавать лог кому-то, включая ИИ.
Лог, в котором нет ничего. Если при ошибке в логе пусто, значит, логировать забыли — и единственный способ узнать причину уже потерян.
Лог, в котором всё. Обратная крайность: DEBUG на всё подряд в рабочем
режиме. Файл растёт, важное тонет, диск кончается.
Сообщение без данных. log.error("ошибка") не говорит ничего. Хорошая
запись содержит значения: какой город, какой пользователь, какой код ответа.
Логирование внутри цикла по тысяче элементов. Тысяча строк на один запрос. Логируй итог, а не каждый шаг.
Шпаргалка
Лог важнее трейсбека: показывает, что было до падения.
Пять уровней: DEBUG · INFO · WARNING · ERROR · CRITICAL.
Читай снизу вверх до первой неожиданности, смотри на разрывы во времени.
WARNINGпередERRORчасто и есть настоящая причина.print— пока отлаживаешь,logging— всё, что остаётся в коде.В сообщении всегда указывай значения. Секреты не логируй.