Python, используя concurrent.futures и модуль регистрации вместе - PullRequest
0 голосов
/ 04 мая 2020

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

Так что я пытаюсь вместо этого иметь один вывод журнала на поток. Тем не менее, в моем примере ниже весь вывод из каждого потока сбрасывается в один файл с именем 1-one.log.

Я полагаю, что я отправил вызовы журнала для настройки файла журнала в неправильном месте, но я не уверен, как получить результат, когда у меня есть один файл журнала на поток.

Любой предложения? Приведенный ниже код должен запускаться только путем изменения пути диска для расположения журнала. Если вы посмотрите на вывод файла журнала, вы увидите, что вы просто получите беспорядок, поскольку каждый поток обращается к файлу и создает дамп вызовов по мере их возникновения, давая асинхронный вывод ...

Спасибо

import concurrent.futures
import traceback
import threading
import logging

global sub_dict

sub_dict = {
1: 'one',
2: 'two',
3: 'three',
4: 'four',
5: 'five',
6: 'six',
7: 'seven',
8: 'eight'
}


def test_func(new_dict, i):


    new_dict2 = {}
    new_dict2.update({new_dict[0] : new_dict[1]})

    for key, value in new_dict2.items():

        log_path = ''.join(('C:\\Users\\<your user>\\AppData\\Local\\WebGrab+Plus\\Addons\\Log Files\\', str(key), '-', str(value), '.log'))

        logging.basicConfig(level=logging.DEBUG, format='%(asctime)s :: %(levelname)s :: %(message)s', filename=log_path, filemode='w')
        logging.captureWarnings(True)
        logger = logging.getLogger(__name__)


        try:

            logging.info('{}'.format('This is an example...'))
            logging.info('{} {}'.format(key, value))
            logging.info('{}'.format('Of why concurrent logging into a single file...'))
            logging.info('{}'.format('Is a complete an utter mess...'))


        except Exception as exc:

            print('%r generated an exception: %s' % (new_dict2, exc))



    return key, value, i


def concurrent_func():

    with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
        future_to_pair = {executor.submit(test_func, v, i): (i, v) for i, v in enumerate(sub_dict.items(), 1)}

        for future in concurrent.futures.as_completed(future_to_pair):       
            pair = future_to_pair[future]

            try:     
                data = future.result()

            except Exception as exc:      
                print('%r generated an exception: %s' % (pair, exc))

            else:
                print(data)


concurrent_func()
...