Регистрация в одном файле из нескольких процессов в нескольких модулях - PullRequest
0 голосов
/ 30 марта 2020

В Ведение журнала Кулинарная книга Я нашел Регистрация в одном файле из нескольких процессов , я хотел бы использовать его с несколькими модулями, каждый модуль - это процесс, есть ли у вас какие-либо идеи? ? Я использовал первый код в Ведение журнала в один файл из нескольких процессов . Скажем, main в модуле и worker_process в другом, как это сделать? main.py:

def listener_configurer():
    root = logging.getLogger()
    h = logging.handlers.RotatingFileHandler('mptest.log', 'a', 300, 10)
    f = logging.Formatter('%(asctime)s %(processName)-10s %(name)s %(levelname)-8s %(message)s')
    h.setFormatter(f)
    root.addHandler(h)

def listener_process(queue, configurer):
    configurer()
    while True:
        try:
            record = queue.get()
            if record is None:  # We send this as a sentinel to tell the listener to quit.
                break
            logger = logging.getLogger(record.name)
            logger.handle(record)  # No level or filter logic applied - just do it!
        except Exception:
            import sys, traceback
            print('Whoops! Problem:', file=sys.stderr)
            traceback.print_exc(file=sys.stderr)


def main():
    queue = multiprocessing.Queue(-1)
    listener = multiprocessing.Process(target=listener_process,
                                       args=(queue, listener_configurer))
    listener.start()
    workers = []
    for i in range(10):
        worker = worker_process.TEST(queue)

        workers.append(worker)
        worker.start()
    for w in workers:
        w.join()
    queue.put_nowait(None)
    listener.join()

if __name__ == '__main__':
    main()

worker_process.py

def worker_configurer(queue):
    h = logging.handlers.QueueHandler(queue)
    root = logging.getLogger()
    root.addHandler(h)

    root.setLevel(logging.DEBUG)



class TEST(multiprocessing.Process):

    def __init__(self, queue, func=worker_configurer):
        super(TEST, self).__init__()
        self.queue = queue
        self.func = func

        self.LEVELS = [logging.DEBUG, logging.INFO, logging.WARNING,
              logging.ERROR, logging.CRITICAL]

        self.LOGGERS = ['a.b.c', 'd.e.f']

        self.MESSAGES = [
        'Random message #1',
        'Random message #2',
        'Random message #3',
        ]

    def run(self):
        self.func(self.queue)
        name = multiprocessing.current_process().name
        print('Worker started: %s' % name)
        for i in range(10):
            time.sleep(random())
            logger = logging.getLogger(choice(self.LOGGERS))
            level = choice(self.LEVELS)
            message = choice(self.MESSAGES)
            logger.log(level, message)
        print('Worker finished: %s' % name)

Это неправильно работает, я хотел бы использовать код (первый код) в do c с несколькими модулями, как я упоминал ранее.

...