Проблемы с входом в Python из нескольких модулей - PullRequest
5 голосов
/ 08 сентября 2011

У меня есть 3 модуля Python.

LogManager.py
Runner.py
Other.py

Runner.py - первый главный модуль в цепочке событий, и из этого модуля вызываются функции внутри Other.py.

Итак, внутри Runner.py У меня есть вызов функции для LogManager.py

logger = LogManager.get_log()

и оттуда я могу делать простые журналы, например logger.critical("OHNOES")

То, что я ХОЧУ, чтобы сделать функцию get_log, похоже на одноэлементный шаблон, где, если регистратор не настроен, он настроит регистратор и вернет его. Иначе, он просто вернет регистратор.

Содержимое LogManager.py:

import logging

def get_log():
    logger = logging.getLogger('PyPro')
    logger.setLevel(logging.DEBUG)

    # create file handler which logs even debug messages
    fh = logging.FileHandler('pypro.log')
    fh.setLevel(logging.DEBUG)

    # create console handler with a higher log level
    ch = logging.StreamHandler()
    ch.setLevel(logging.WARNING)

    # create formatter and add it to the handlers
    fhFormatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
    chFormatter = logging.Formatter('%(levelname)s - %(filename)s - Line: %(lineno)d - %(message)s')
    fh.setFormatter(fhFormatter)
    ch.setFormatter(chFormatter)

    # add the handlers to logger
    logger.addHandler(ch)
    logger.addHandler(fh)

    logger.info("-----------------------------------")
    logger.info("Log system successfully initialised")
    logger.info("-----------------------------------")

    return logger

Как видите, LogManager.get_log () будет пытаться настроить журнал каждый раз, когда он вызывается. На самом деле, я немного сбит с толку относительно того, что именно происходит ...

Runner.py вызывает функцию get_log в своем основном методе. Other.py вызывает get_log в глобальной области видимости (сразу после импорта, а не в любой функции)

В результате все журналы, которые я делаю, регистрируются дважды, так как обработчики создаются дважды для регистратора.

Каков самый простой способ пропустить функцию get_log для возврата экземпляра того же журнала в противном случае?

1 Ответ

5 голосов
/ 08 сентября 2011

Модуль logging уже реализует шаблон синглтона для вас - когда вы вызываете logger.getLogger(name), он создает регистратор, если он еще не сделал этого, и возвращает его. Хотя это не в точности , что вы просите, я бы предложил просто переименовать get_log() в setup_log(), поскольку это то, что он делает. Затем вы можете просто позвонить setup_log() один раз, в начале вашего кода. После этого, когда вам действительно понадобится регистратор, просто используйте logging.getLogger(), и он вернет уже настроенный регистратор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...