Я использую утилиту регистрации питонов для ведения журнала в нескольких потоках ( одновременный ). В отличие от многих примеров по этому ( cookbook , еще один вопрос, поэтому ) Я хочу, чтобы каждый поток записывал в свой собственный файл (оставляйте отдельные журналы потоков). Это хорошо работает, используя отдельный FileHandler
для каждого регистратора (и явно получая именованный регистратор для каждого потока), как показано в примере ниже.
Теперь возникает проблема, что я хотел бы вызывать более универсальные пакеты из каждого потока, а также из других мест в коде, которые производят свои собственные журналы. Как я могу гарантировать, что их записи будут записаны в файл, принадлежащий потоку, который его вызвал?
import logging
import concurrent.futures
def generic_function(xyz):
logger = logging.getLogger(__name__)
logger.info("Very generic stuff")
def do_work(i):
logger = logging.getLogger(f'logger{i}')
logger.setLevel(logging.INFO)
fh = logging.FileHandler(f'logging_{i}.log')
logger.addHandler(fh)
logger.info(f"BeeBaaBoo {i}")
generic_function(123)
return
outps = []
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
for i in range(10):
outp = executor.submit(do_work, i)
outps.append(outp)
for outp in outps:
if outp.exception() is not None:
raise outp.exception()
Я знаю, что могу обойти экземпляр регистратора или его имя, но для этого потребуется, чтобы универсальный пакет был более конкретным. Я могу изменить общий пакет, чтобы адаптировать его к лучшим принципам ведения журналов, но не хочу, чтобы он ожидал моего многопоточного бизнеса.
Может быть, можно изменить регистратор, который будет получен при запросе нового?