2013-02-19 2 views
0

У меня есть веб-приложение Flask, а конфигурация регистрации Python выполняется через dictConfig при запуске приложения. Обработчик для записи определенных журналов в базу данных привязан к logger 'test.module' Журналы, сделанные для этого регистратора, записываются в базу данных, только если logging.basicConfig(level=logging.DEBUG) также вызывается при запуске приложения. В противном случае в базу данных не записываются журналы. Я знаю, что basicConfig просто привязывает streamHandler к корневому журналу. Я думаю, что это должно быть неуместно, потому что я не хочу, чтобы что-то было сделано корневым регистратором. Почему это не работает без basicConfig?Обработчики лесозаготовок не работают без basicConfig

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

class DbHandler(logging.Handler): 
    def __init__(self, level=logging.NOTSET): 
     logging.Handler.__init__(self, level) 

    def emit(self, record): 
     record.message = self.format(record) 
     log = DbModel() 
     log.message = record.message 
     log.save() 


LOGGING = { 
    'version': 1, 
    'handlers': { 
     'db_log': { 
      'level': 'DEBUG', 
      'class': 'test.handlers.DbHandler', 
     }, 
    }, 
    'loggers': { 
     'test.important_module': { 
      'handlers': [ 
       'db_log' 
      ], 
    }, 
} 

# logging.basicConfig(level=logging.DEBUG) # Doesnt work without this 
logging.config.dictConfig(LOGGING) 

logger = logging.getLogger('test.important_module') 
logger.info('Making a test') 
+0

Может вам код, который вы используете для настройки регистратора и как это относится к коду, делая фактическую регистрацию ? То, что вы предоставили до сих пор, несколько расплывчато ... – isedev

+0

@isedev Я добавил его сейчас – refik

+1

С точки зрения удобства использования я бы переосмыслил, что обработчик модифицировал 'record.message' как побочный эффект. Просто установите 'log.message = self.format (запись)' непосредственно. –

ответ

3

Вы не устанавливая уровень для «» test.important_module регистратор сам (вы только установить уровень для обработчика).

Вы можете сделать это следующим образом:

logger = logging.getLogger('test.important_module') 
logger.setLevel(logging.DEBUG) 

Или так:

'loggers': { 
    'test.important_module': { 
     'level': 'DEBUG',   # <<< HERE 
     'handlers': [ 
      'db_log' 
     ], 
}, 
+0

О, спасибо. Просто любопытно, почему у basicConfig был побочный эффект от его работы? Он устанавливает уровень для всех регистраторов? – refik

+0

Как я понял, когда я вызывал logger.info в 'test.important_module', запись не делала его обработчиком db_log, поскольку у регистратора не было уровня. После вызова basicConfig root получает уровень DEBUG. Итак, теперь, когда я вызываю logger.info в журнале test.important_module, все еще не имеет уровня, поэтому запись все равно не должна переходить к обработчику db_log. Позже запись распространяется на root, и я вижу ее напечатанную на консоли. Но это не объясняет, почему запись была записана в базе данных после того, как root получил уровень. Я ошибаюсь? – refik

+1

doh, извините ... мой плохой, не знаю, о чем я думал. Я хотел сказать, что test.important_module имел уровень NOTSET, поэтому наследовал бы от корневого регистратора. – isedev

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