Начните с трёх уровней подробности, они разные по цене и включаются в разных ситуациях.
Уровень первый, постоянный. Одна строка на каждое обращение, всегда, даже на успешных. В строке обязаны быть: метка времени с миллисекундами, порядковый номер обращения, адрес, код ответа, размер тела, время целиком, номер попытки. Семь полей, строка короткая, места ест немного, а разобрать по ней можно почти всё.
Уровень второй, на отказах. При любом исходе, кроме успеха, дописываете тип исключения и его текст целиком, вместе со следом вызовов. Ловить голое Exception и печатать своё слово это худшее, что можно сделать с отладкой, у вас именно это и вышло.
import logging, traceback
log = logging.getLogger("obhod")
try:
otvet = sessiya.get(adres, timeout=20)
log.info("%s %s код=%s байт=%s время=%.3f попытка=%s",
nomer, adres, otvet.status_code, len(otvet.content),
otvet.elapsed.total_seconds(), popytka)
except Exception as e:
log.error("%s %s сорвалось: %s: %s\n%s",
nomer, adres, type(e).__name__, e, traceback.format_exc())
```
Уровень третий, по кнопке. Полный обмен байтами, заголовки в обе стороны, ход рукопожатия. Включается переменной окружения на время разбора, потому что пишет мегабайты.
import http.client
http.client.HTTPConnection.debuglevel = 1
logging.getLogger("urllib3").setLevel(logging.DEBUG)
Для проверки руками тот же третий уровень даёт curl -v, а если нужен совсем сырой поток, curl --trace-ascii /tmp/obmen.txt. Там видно каждый байт в обе стороны.