единый регистратор в проекте Python? - PullRequest
3 голосов
/ 31 марта 2011

Я хотел бы создать регистратор для проекта Python.Я хочу убедиться, что я использую один и тот же регистратор для каждого модуля в проекте.Каков наилучший способ сделать это?Кажется, мне нужен глобальный объект регистрации?Или, возможно, модуль регистрации, который импортируется любым другим модулем?Я хочу убедиться, что я всегда пишу в один и тот же файл журнала.

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

Ответы [ 3 ]

5 голосов
/ 31 марта 2011

Как вы говорите, посмотрите на модуль Python logging

Он предоставляет такие объекты, как Logger и Handler, я думаю, он может работать для вас.

3 голосов
/ 31 марта 2011

Шаблон singleton идеально подходит для подобных ситуаций. В Python вы бы реализовали это примерно так:

class MySingleton(object):
     __instance = None

    def __init__(self):
        if self.__class__.__instance:
            raise Exception, """
                             Tried to allocate a second instance of a singleton.
                             Use getInstance() instead.
                             """

        self.__class__.__instance = self

    @classmethod
    def getInstance(cls):
        if not cls.__instance:
            cls()

        return cls.__instance

Затем вы можете импортировать модуль, как обычно, и использовать MySingleton.getInstance (), чтобы получить экземпляр класса. Внутри данного приложения вы гарантированно получите один и тот же экземпляр.

РЕДАКТИРОВАТЬ: Другие отметили модуль logging , и я согласен с ними, что использование этого, вероятно, лучший вариант, чем написание вашего собственного регистратора. Однако, если вам по какой-либо причине необходимо написать собственный регистратор, возможно, вы захотите использовать приведенный выше шаблон.

0 голосов
/ 14 марта 2012

Определите объект регистратора в модуле __builtin__.Таким образом, вы можете получить к нему доступ, как и к любой другой глобальной функции python, не импортируя какой-либо модуль журналирования в каждый файл.

в logmodule.py:

import __builtin__
__builtin__.log = logging.getLogger('global')
# ... configure your logger

В вашем основном файле:

import logmodule

В другом файле:

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