Иерархия логеров#

https://raw.githubusercontent.com/natenka/advpyneng-book/master/docs/source/_static/loggers.png

В модуле logging есть иерархия логеров. Самый главный в иерархии root. Остальные под ним, часто, на одном уровне. В одном модуле может быть много логеров с разной иерархией, например, в paramiko есть логер paramiko.transport, он по иерархии ниже paramiko.

Такой конфиг настраивает logger root:

logging.basicConfig(
    level=logging.INFO
)

Так как он самый главный, его настройка приводит к тому, что все остальные логеры тоже начинают отображать информацию. При такой настройке настраивается конкретный logger и никакие другие логи уже не сыпятся.

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
formatter = logging.Formatter(
    "%(threadName)s %(name)s %(levelname)s %(asctime)s: %(message)s", datefmt="%H:%M:%S"
)
console.setFormatter(formatter)
logger.addHandler(console)

Хотя тут тоже можно использовать root, для этого надо первую строку написать так

logger = logging.getLogger()

С базовым конфигом надо отключить или хотя бы приглушить на какой-то уровень существующие логеры других модулей:

logging.getLogger("paramiko").setLevel(logging.WARNING)

logging.basicConfig(
    level=logging.INFO
)

Со своим логером (не root) - надо наоборот добавить строк чтобы включить logger netmiko/paramiko. Для этого надо добавлять такие строки (учитывая что предыдущие все есть с handler, formatter и тп

netmiko_log = logging.getLogger("netmiko")
netmiko_log.setLevel(logging.DEBUG)
netmiko_log.addHandler(console)