Не создавайте потенциально неограниченное количество регистраторов, это не очень хорошая практика - есть другие способы получения контекстно-зависимой информации в ваши журналы, как описано здесь .
Вам также не нужно иметь регистратор в качестве атрибута экземпляра: регистраторы являются одиночными, поэтому вы можете просто получить конкретный по имени из любого места. Рекомендуется именовать регистраторы на уровне модуля, используя
logger = logging.getLogger(__name__)
, что достаточно для большинства сценариев.
Из вашего вопроса я не могу сказать, понимаете ли вы, что обработчики и регистраторы - это не одно и то же - например, вы говорите о вызовах removeHandler (которые могут служить для освобождения экземпляров обработчиков, поскольку их счетчики обращаются в ноль, но при этом вы не освободите экземпляры регистратора).
Как правило, регистраторы именуются по частям вашего приложения, которые генерируют интересующие вас события.
Если вы хотите, чтобы каждый поток, например, записывая в другой файл, вы можете каждый раз создавать новое имя файла, а затем закрывать обработчик, когда закончите, и поток собирается завершиться (это закрытие важно для освобождения ресурсов обработчика). Или вы можете записать все в один файл с идентификаторами потоков или другими дискриминаторами, включенными в выходные данные журнала, и использовать постобработку файла журнала.