Обработчики журналов: Как мне убедиться, что я не делаю два? - PullRequest
5 голосов
/ 12 апреля 2011

Редактировать: я закончил тем, что отвечал на вопрос моего вопроса, чтобы у меня был работающий модуль регистрации. Однако у меня все еще есть связанный вопрос. Смотрите мой ответ ниже.

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

import logging, tempfile, os, sys

def getlog(logname, filename = 'python.log', directory = None):
   '''returns a logger with logname that will print to filename and directoryname.'''
   if directory == None:
      fd, fname = tempfile.mkstemp()
      directory = os.path.dirname(fname)

   fullpath = directory + '/' + filename

   mylog = logging.getLogger(logname)
   hdlr = logging.FileHandler(fullpath)

   formatter = logging.Formatter('L:%(name)s M:%(module)s T:%(asctime)s > %(levelname)s: %(message)s')
   hdlr.setFormatter(formatter)
   mylog.addHandler(hdlr)
   mylog.setLevel(logging.INFO)
   mylog.info('NEW LOGGER STARTED')
   return mylog

if __name__ == '__main__':
   log = getlog('testing')
   log.info('working?')
   log.info('yes, seems to be working')

   log2 = getlog('testing')
   log2.info('still working?')

Вот вывод:

L:testing M:easy_log T:2011-04-11 15:30:14,315 > INFO: NEW LOGGER STARTED
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: working?
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: yes, seems to be working
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: NEW LOGGER STARTED
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: NEW LOGGER STARTED
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: still working?
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: still working?

Как видите, теперь выводится double. Тем не менее, модуль журналирования довольно запутанный, и я не знаю, как узнать, был ли создан экземпляр журнала, или если у объекта журнала уже есть обработчик. Некоторая помощь будет оценена.

Редактировать: чтобы добавить немного больше деталей, я планирую вызвать это в нескольких модулях, по сути, пытаясь заменить вызов "logging.getLogger".

1 Ответ

1 голос
/ 12 апреля 2011

В итоге я ответил на свой вопрос. Вот код

global IS_SETUP 
IS_SETUP = False
def setuplogger(filename = 'python.log', directory = None, format = 'L:%(name)s M:%(module)s T:%(asctime)s > %(levelname)s: %(message)s'):
   global IS_SETUP
   if directory == None:
      fd, fname = tempfile.mkstemp()
      directory = os.path.dirname(fname)

   logging.basicConfig(filename = directory + '/' + filename, format = format)
   IS_SETUP = True

def getlog(logname, level = logging.INFO):
   '''returns a logger with logname that will print to filename and directoryname.'''
   if IS_SETUP == False:
      setuplogger()

   mylog = logging.getLogger(logname)

   mylog.setLevel(level)
   mylog.info('NEW LOGGER STARTED')
   return mylog

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

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

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