Форум сайта python.su
Доброго дня, уважаемые.
Работаю в многопоточном режиме (работа с 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
Отредактировано Misha_White (Окт. 16, 2023 17:55:02)
Офлайн
Задвоение идет потому что вы вызываете повторно функцию
В случае с выводом по разным файлам - это допустимо так как каждая строка идет в свой файл
А вот “консоль” у вас физически одна по этому и двоятся сообщения
Для начала попроуйте создать класс вместо фукнции
Тогда у вас получится обьект и уже его используйте для выхлопа
Офлайн