Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 16, 2023 17:18:38

Misha_White
Зарегистрирован: 2017-07-19
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

loggining в threading

Доброго дня, уважаемые.

Работаю в многопоточном режиме (работа с com-портами).
Хочу разделить логи: для каждого потока: свой файл.
Правильно ли я действую? Вызываю в target'ах get_logger() с уникальным идентификатором (именем) и именем файла.
Логи по потокам разделились, но если добавить консоль (закомменчено), то в консоли строки задваиваются. Опять же, если в разных потоках указать одно и то же имя логгера и имя файла, то получаю задвоение строк. Если разные имена логгера, и одно имя файла, то задвоения нет, но не уверен, что оно друг другу не будет мешать (одновременная запись из разных потоков).
Как быть с выводом в консоль? Использовать его только во время тестирования?
Что посоветуете?

 def get_logger(logger_name, filename):
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.INFO)
    fh = RotatingFileHandler(filename, mode='a', maxBytes=5 * 1024 * 1024, backupCount=500)
    formatter = logging.Formatter('%(asctime)s\t-\t'
                                  '%(levelname)s\t-\t'
                                  '%(name)s\t-\t'
                                  '%(threadName)s\t-\t'
                                  '%(message)s')
    fh.setFormatter(formatter)
    logger.addHandler(fh)
    # создать обработчик консоли и установить уровень для отладки
    # ch = logging.StreamHandler()
    # ch.setLevel(logging.DEBUG)
    # logger.addHandler(ch)
    return logger

UPD: Пишется всё (со всех потоков) в основной логгер (как не предполагалось) и дополнительно по отдельным файлам (как предполагалось).

UPD2: В основной лог пишется, если потоковые логи создавать как потомков (“main.children”).

Отредактировано Misha_White (Окт. 16, 2023 17:55:02)

Офлайн

#2 Окт. 17, 2023 09:29:18

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

loggining в threading

Задвоение идет потому что вы вызываете повторно функцию
В случае с выводом по разным файлам - это допустимо так как каждая строка идет в свой файл
А вот “консоль” у вас физически одна по этому и двоятся сообщения
Для начала попроуйте создать класс вместо фукнции
Тогда у вас получится обьект и уже его используйте для выхлопа



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version