Вход в Python в Django - PullRequest
       27

Вход в Python в Django

41 голосов
/ 05 декабря 2008

Я занимаюсь разработкой приложения Django и пытаюсь использовать модуль журналирования Python для регистрации ошибок / трассировки. В идеале мне бы хотелось, чтобы разные логгеры были настроены для разных областей сайта. Пока у меня все это работает, но одна вещь заставляет меня чесать голову.

У меня есть корневой логгер, идущий в sys.stderr, и я настроил другой регистратор для записи в файл. Это в моем файле settings.py:

sviewlog = logging.getLogger('MyApp.views.scans')
view_log_handler = logging.FileHandler('C:\\MyApp\\logs\\scan_log.log')
view_log_handler.setLevel(logging.INFO)
view_log_handler.setFormatter(logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s'))
sviewlog.addHandler(view_log_handler)

Кажется, довольно просто. Но вот в чем проблема: все, что я пишу в sviewlog, записывается в файл журнала дважды. Корневой регистратор печатает его только один раз. Это как addHandler () вызывается дважды. И когда я помещаю свой код через отладчик, это именно то, что я вижу. Код в settings.py выполняется дважды, поэтому два FileHandlers создаются и добавляются в один и тот же экземпляр регистратора. Но почему? И как мне обойти это?

Может кто-нибудь сказать мне, что здесь происходит? Я попытался переместить код создания логгера / обработчика sviewlog в файл, в котором он используется (так как это на самом деле кажется мне подходящим местом), но у меня там та же проблема. В большинстве примеров, которые я видел в Интернете, используется только корневой регистратор, и я предпочел бы иметь несколько регистраторов.

Ответы [ 11 ]

0 голосов
/ 05 декабря 2008

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

В качестве альтернативы; Можете ли вы сначала проверить, существует ли журнал MyApp.views.scans? Если он существует (возможно, возникает ошибка), вы можете просто пропустить создание (и, следовательно, больше не добавлять обработчик). Более чистый способ, но я еще не пробовал.

Также должно быть более подходящее место, чтобы поставить этот код (__init__.py?). settings.py для настроек.

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