API basicConfig()
при ведении журнала ничего не сделает (как описано), если в корневом логгере уже настроены обработчики. Ваш вызов basicConfig()
может быть проигнорирован, потому что другой код на сервере уже настроил некоторые обработчики для корневого регистратора.
В общем случае код библиотеки не должен добавлять обработчики - это обязанность разработчика приложения. Однако, если вы, например, При разработке веб-приложения с использованием фреймворка в фреймворке уже могут быть настроены некоторые обработчики.
Вы говорите «на сервере», но неясно, говорите ли вы о служебном приложении или просто запускаете служебный скрипт на компьютере, который является сервером. Как вы говорите, виртуальные envs немного отличаются, поэтому разница между ними может быть местом для поиска подсказки.
Чтобы узнать, как настраивать обработчики в корневом логгере, вы можете найти соответствующие источники для basicConfig()
или addHandler()
.
В качестве альтернативы, вы можете явно добавить обработчик, а не полагаться на basicConfig()
, чтобы сделать это за вас:
f = logging.Formatter('%(levelname)-8s %(message)s')
h = logging.StreamHandler()
h.setFormatter(f)
logging.getLogger().addHandler(h)
, но это может привести к появлению нескольких сообщений, если к корневому логгеру также будут добавлены другие обработчики консоли.