Объединить выходные данные обработчика журналирования PythonPython

Программы на Python
Anonymous
Объединить выходные данные обработчика журналирования Python

Сообщение Anonymous »


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

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

импорт журнала импортировать систему защита Third_party_use(): print_log = logging.StreamHandler(stream=sys.stdout) print_log.setLevel(logging.INFO) print_log.name = "Журнал SubPrint" print_log.setFormatter(logging.Formatter("SubPrintLog %(name)s - %(levelname)s: %(message)s")) Third_party_logger = logging.getLogger("ThirdParty") Third_party_logger.addHandler(print_log) Third_party_logger.info("Я не хочу, чтобы это печаталось дважды") если __name__ == '__main__': print_log = logging.StreamHandler(stream=sys.stdout) print_log.setLevel(logging.INFO) print_log.name = "МойPrintLog" print_log.setFormatter(logging.Formatter("MyPrintLog %(name)s - %(levelname)s: %(message)s")) logging.basicConfig(уровень=0, обработчики=[print_log]) logger = logging.getLogger(__name__) logger.debug("Этого не должно быть") logger.info("Это должно быть") logger.warning("Это определенно должно быть") Third_party_use() logger.info("Опять мои вещи") доходность:

MyPrintLog __main__ — ИНФОРМАЦИЯ: это должно MyPrintLog __main__ – ВНИМАНИЕ: это определенно должно SubPrintLog ThirdParty – ИНФОРМАЦИЯ: я не хочу, чтобы это печаталось дважды MyPrintLog ThirdParty – ИНФОРМАЦИЯ: я не хочу, чтобы это печаталось дважды MyPrintLog __main__ – ИНФОРМАЦИЯ: Опять мои вещи Есть ли способ настроить MyPrintLog так, чтобы он не воспроизводил выходные данные из ThirdParty (предположим, у нас нет доступа для изменения конфигурации ThirdParty) Я надеялся, что флаг propagate решит эту проблему, но он движется в другом направлении, и мы не можем изменить ThirdParty)

Одно из «работающих» решений — эффективно отключить MyPrintLog при вызове ThirdParty:

def Turn_off_console(): для idx обработчик в перечислении (logger.root.handlers): если handler.name == "MyPrintLog": старый_уровень = уровень_обработчика handler.setLevel(logging.CRITICAL) вернуть идентификатор, старый_уровень Защиту Turn_on_console (handle_index, уровень): logger.root.handlers[handle_index].setLevel(уровень) А затем оборачиваем каждый доступ третьей стороне:

idx, old_level = Turn_off_console() Third_party_use() Turn_on_console (idx, old_level) Что дает правильный результат:

MyPrintLog __main__ — ИНФОРМАЦИЯ: это должно MyPrintLog __main__ – ВНИМАНИЕ: это определенно должно SubPrintLog ThirdParty – ИНФОРМАЦИЯ: я не хочу, чтобы это печаталось дважды MyPrintLog __main__ – ИНФОРМАЦИЯ: Опять мои вещи Но это означает, что мне приходится каждый раз переключать регистратор, что чревато ошибками.

РЕДАКТИРОВАТЬ:::РЕШЕНО

класс NoThirdParty(logging.Filter): фильтр def (сам, запись): return not Record.name == "ThirdParty" если __name__ == '__main__': print_log = logging.StreamHandler(stream=sys.stdout) print_log.setLevel(logging.INFO) print_log.addFilter(NoThirdParty()) # Не воспроизводить данные третьих лиц! print_log.name = "МойPrintLog" print_log.setFormatter(logging.Formatter("MyPrintLog %(name)s - %(levelname)s: %(message)s")) ... доходность:
MyPrintLog __main__ — ИНФОРМАЦИЯ: это должно MyPrintLog __main__ – ВНИМАНИЕ: это определенно должно SubPrintLog ThirdParty – ИНФОРМАЦИЯ: я не хочу, чтобы это печаталось дважды MyPrintLog __main__ – ИНФОРМАЦИЯ: Опять мои вещи

Вернуться в «Python»