2012-01-09 4 views
5

Я тестирую некоторые модели Django с бокс-standerd django.test.Testcase. Мой models.py записывает в журнал отладки, используя следующий код инициализации:Как остановить регистрацию в Django unittests от печати до stderr?

import logging 
logger = logging.getLogger(__name__) # name is myapp.models 

и затем я пишу в журнал с:

logger.debug("Here is my message") 

В моем settings.py, я создал один FileHandler и журнал для myapp, используя этот обработчик и только этот обработчик. Отлично. Я вижу сообщения в этом журнале. Когда я нахожусь в оболочке Django, я вижу только .

Когда, однако, я запускаю свой тестовый пакет, моя консоль тестового набора также видит все эти сообщения. Он использует другой форматтер, который я явно не определил, и он пишет stderr. У меня нет обработчика журнала, который записывает в stderr.

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

Edit: Я создал два обработчика в моем settings.py:

'handlers': { 
    'null': { 
     'level': 'DEBUG', 
     'class': 'django.utils.log.NullHandler', 
    }, 
    'logfile' : { 
     'level':'DEBUG', 
     'class':'logging.FileHandler', 
     'filename':'%s/log/development.log' % PROJECT_DIR, 
     'formatter': 'simple' 
    }, 
}, 

и попытался это:

'loggers': { 
    'django': { 
     'level': 'DEBUG', 
     'handlers': ['null'] 
    }, 
    'myapp': { 
     'handlers': ['logfile'], 
     'level':'DEBUG', 
    }, 

... но поведение демпинга logging/stderr остается неизменным. Это похоже на то, что я получаю еще один обработчик журналов, когда я запускаю тесты.

+0

Вы спрашиваете, как настроить ведение журнала специально для команды test или runtest? Вы пытались изменить свой 'settings.py'? –

+0

Ведение журнала ведет себя по-разному, когда я запускаю тесты по сравнению с тем, когда я не являюсь. Я хочу, чтобы это остановилось. Я думаю, что logging config в settings.py, вероятно, хочет меняться; Я просто не знаю, что мне нужно изменить. Пробовал задавать обработчик django по умолчанию без везения. – Nate

+0

Добавление некоторых ковычек в один из моих методов тестирования фактически только, кажется, делает вещи более запутанными. Если в моем тесте я делаю ml = logging.getLogger ('myapp.models'), у него, похоже, нет обработчиков (предполагается, что ml.handlers должны их перечислить). В этом контексте, однако, выполнение ml.debug («MESSAGE») записывается в файл журнала, но не stderr. Теперь я полностью озадачен. – Nate

ответ

3

Из вашего конфигурационного фрагмента не видно, какие обработчики, если они есть, настроены для корневого регистратора. (Я также предполагаю, что вы используете Django 1.3.) Можете ли вы исследовать и сообщить нам, какие обработчики были добавлены в корневой журнал при выполнении тестов? AFAICT Django ничего не добавляет - возможно, какой-то код, который вы импортируете, вызывает вызов basicConfig, если вы его не понимаете. Используйте что-то вроде ack-grep, чтобы искать любые вхождения fileConfig, dictConfig, basicConfig и addHandler - все это могло бы добавить обработчик в корневой журнал.

Другое дело: установите флаг распространения False для всех регистраторов верхнего уровня (например, «django», а также те, которые используются вашими модулями - скажем, «myapp»). Это что-то меняет?

+2

Ага! Добавление «распространение»: False для регистратора для myapp - это трюк. Я пробовал это, но ошибочно написал это как «propogate», что, что неудивительно, не сработало. Благодаря! – Nate

+0

это большая опечатка, и я тоже немного ее уловил. 'propAgate', * not *' propOgate' –

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