2015-02-17 2 views
1

Я попытался установить getLogger на уровень модуля. Однако он имеет некоторые недостатки. Вот мой пример:Python: где поставить logging.getLogger

from logging.handlers import TimeRotatingFileHandler 

log_monitor = logging.getLogger('monitorlog') 
log_monitor.setLevel(logging.DEBUG) 
log_monitor.propagate = False 
handler = TimedRotatingFileHandler('somedirectory/monitor.log', 
            when='h', 
            interval=1, 
            backupCount=30) 
monitor_format = logging.Formatter('%(asctime)s: %(message)s') 
handler.setFormatter(monitor_format) 
log_monitor.addHandler(handler) 

Проблема в том, что когда какой-либо другой модуль импортирует этот код, будет выполнен вышеуказанный код. Возможно, в то время somedirectory даже не существует, и сборка завершится неудачно.

Фактически, этот регистратор будет использоваться в классе, поэтому я думаю о том, чтобы положить getLogger в класс. Тем не менее, я чувствую, что если люди создают несколько объектов этого класса, этот фрагмент кода будет вызываться несколько раз. Я предполагаю, что эта часть кода должна быть вызвана только один раз.

Я довольно новичок в python. Где люди обычно ставят свои getLogger и в этом случае, где я должен положить этот кусок кода?

ответ

1

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

Если вы хотите импортировать вышеупомянутое и только затем создать файл, один из способов сделать это - поставить свой код в функцию.

def monitor_log_setup(): 
    log_monitor = logging.getLogger('monitorlog') 
    log_monitor.setLevel(logging.DEBUG) 
    log_monitor.propagate = False 
    handler = TimedRotatingFileHandler('somedirectory/monitor.log', 
             when='h', 
             interval=1, 
             backupCount=30) 
    monitor_format = logging.Formatter('%(asctime)s: %(message)s') 
    handler.setFormatter(monitor_format) 
    log_monitor.addHandler(handler) 

    return log_monitor 

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

Затем вы можете использовать logging.getLogger('monitorlog') для возврата того же регистратора, что и в функции, когда вам это нужно на протяжении всего кода.

0

Я думаю, что проблема заключается в том, что вы пытаетесь перепутать «импорт» с помощью «init», вы ожидаете, что после вызова библиотеки библиотеки или модуля появится объект API, этот объект журнала будет доступен, это приведет к запутанному пониманию , Я думаю, что лучшая практика заключается в том, чтобы предоставить метод «init», метод вызова «init» вызывающего абонента, сделать объект доступным. Однако вы также можете предоставить неявный метод init в файле или просто создать файл журнала, если он не существует.

Смежные вопросы