Изменить регистратор, который вы получите при запросе рута - PullRequest
0 голосов
/ 08 марта 2019

Я использую утилиту регистрации питонов для ведения журнала в нескольких потоках ( одновременный ). В отличие от многих примеров по этому ( 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()

Я знаю, что могу обойти экземпляр регистратора или его имя, но для этого потребуется, чтобы универсальный пакет был более конкретным. Я могу изменить общий пакет, чтобы адаптировать его к лучшим принципам ведения журналов, но не хочу, чтобы он ожидал моего многопоточного бизнеса.

Может быть, можно изменить регистратор, который будет получен при запросе нового?

...