Python: правильный способ входа в один и тот же файл из разных модулей - PullRequest
9 голосов
/ 28 марта 2012

Со временем я написал несколько сценариев, и я нахожусь в процессе преобразования сценариев для сохранения кода DRY .В настоящее время я использую что-то вроде этого в различных сценариях:

if __name__ == '__main__':
    logger = logging.getLogger('dbinit')
    hdlr = logging.FileHandler('/var/logs/tmp/foo.log')
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    hdlr.setFormatter(formatter)
    logger.addHandler(hdlr) 
    logger.setLevel(logging.WARNING)

Вместо того, чтобы повторять это в каждом сценарии (т. Е. "Модуле"), я хотел бы, чтобы инициализация этой регистратора была где-то сделана и доступнаразличные сценарии (Хм, может быть обернуть в одноэлементный класс?).

Если я не могу этого сделать (т.е. поместить код инициализации регистратора в один основной модуль), я предполагаю, что используя тот же файл журналаимя в вызове logging.FileHandler () , различные сценарии будут записывать в один и тот же файл.

Верно ли это предположение?

И последнее, но не менее важное: каков наилучший практический (то есть пифоновский) способ решения этой проблемы?

Ответы [ 3 ]

2 голосов
/ 28 марта 2012

Учитывая, что вы используете if __name__ == __main__, я предполагаю, что эти сценарии будут работать как разные процессы. Если это так, то вам следует использовать отдельный файл конфигурации.

Эта конфигурация может храниться в файле в формате, указанном в документации. Затем вы можете использовать logging.config.fileConfig для загрузки файла. Вы также можете сохранить конфигурацию в форматах JSON / YAML, преобразовать ее в словарь и загрузить, используя logging.config.dictConfig. Последний является текущим рекомендуемым подходом, хотя я считаю первый более прямым. Прочитайте это для получения дополнительной информации.

Преимущества использования подхода с использованием файла конфигурации очень разнообразны:

  1. Хранит параметры конфигурации отдельно от вашего кода
  2. Это позволяет непрограммистам вносить изменения в конфигурацию, поскольку они хранятся в удобных для чтения форматах
  3. Это также удерживает вас от повторения, как вы уже упоминали.
1 голос
/ 17 августа 2017

создайте функцию в вашем модуле python, как показано ниже:

def createLogHandler(job_name,log_file):
    logger = logging.getLogger(job_name)
    ## create a file handler ##
    handler = logging.FileHandler(log_file)
    ## create a logging format ##
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    return logger

Теперь вызовите функцию в вашей программе следующим образом:

job_name = 'dbinit'
log_file = '/var/logs/tmp/foo.log'
logger = createLogHandler(job_name ,log_file )
logger.info('Logger has been created')
0 голосов
/ 28 марта 2012

(...) addHandler () не добавит обработчик, если обработчик уже существует , поэтому наличие такого кода инициализации во многих местах не повредит.

Если я не могу этого сделать (т.е. поместить код инициализации регистратора в один основной модуль)

Вы можете сделать это и сделать это, если хотите убедиться, что код инициализации выполняется один раз.

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