Как полностью сбросить модуль журналирования Python stdlib в сеансе ipython? - PullRequest
6 голосов
/ 17 апреля 2011

Я хотел бы делать повторные вызовы сценариев Python, используя% run в сеансе ipython, и для каждого из этих сценариев вести журнал на основе аргументов cmdline, передаваемых через% run.

Например, во время отладки cmd.py я могу со временем захотеть запустить:

%run cmd.py
... logs with default behavior, e.g. to STDERR with root level WARN

%run cmd.py --log_level DEBUG --log_file /tmp/cmd.out
... logs with root level DEBUG to a file

%run cmd.py --log_level ERROR

К сожалению, это сложно, потому что состояние регистрации, созданное logging.basicConfig, сохраняется после первой команды% run (как правило, справедливо для всех модулей и часто желательно при использовании% run).

Я понимаю, что в общем виде серия команд% run, подобных приведенным выше, не будет такой же, как команда каждой команды в новом процессе. Однако было бы очень удобно, если бы такие вещи, как log_level и log_file, могли быть повторно инициализированы.

Я пробовал что-то подобное в cmd.py:

.
import logging_config  # parse logging config from sys.argv
reload(logging_config) # re-parse cmdline if using %run multiple times

и logging_config.py (сокращенно):

if logging_initialized:
    logging.getLogger().setLevel(lvl)
else:
    logging.basicConfig(level=lvl)
    logging_initialized = True

Работает для простых случаев, но не в том случае, если cmd.py импортирует библиотеки, которые также используют журналирование. Я также экспериментировал с logging.shutdown () (вызывается в конце каждого cmd.py), но это, похоже, не помогает.

1 Ответ

4 голосов
/ 17 апреля 2011

Не используйте basicConfig () для этого стиля использования - он предназначен для простой одноразовой конфигурации и, как сказано в документации, последующие вызовы после первого не имеют никакого эффекта (он только что-то делает если у корневого регистратора нет обработчиков). Это будет хорошо, когда ваш скрипт запускается из командной строки, но не из интерактивного интерпретатора, IPython, IDLE, PythonWin или другой аналогичной среды, в которой процесс, с которым вы взаимодействуете, не завершается.

Вместо этого используйте программную конфигурацию или fileConfig () или dictConfig () - в них есть режимы, в которых существующая конфигурация журнала полностью заменяется новой.

...