Как настроить модуль регистрации Python в Django? - PullRequest
1 голос
/ 02 июня 2010

Я пытаюсь настроить ведение журнала для приложения Django с помощью модуля Python logging. Я поместил следующий бит кода конфигурации в файл settings.py моего проекта Django:

import logging
import logging.handlers
import os
date_fmt = '%m/%d/%Y %H:%M:%S'
log_formatter = logging.Formatter(u'[%(asctime)s] %(levelname)-7s: %(message)s (%(filename)s:%(lineno)d)', datefmt=date_fmt)
log_dir = os.path.join(PROJECT_DIR, "var", "log", "my_app")
log_name = os.path.join(log_dir, "nyrb.log")
bytes = 1024 * 1024   # 1 MB
if not os.path.exists(log_dir):
  os.makedirs(log_dir)
handler = logging.handlers.RotatingFileHandler(log_name, maxBytes=bytes, backupCount=7)
handler.setFormatter(log_formatter)
handler.setLevel(logging.DEBUG)
logging.getLogger().setLevel(logging.DEBUG)
logging.getLogger().addHandler(handler)
logging.getLogger(__name__).info("Initialized logging subsystem")

При запуске я получаю пару сообщений, связанных с Django, а также «Подсистему инициализированной регистрации» в файлах журнала, но затем все сообщения журнала в конечном итоге попадают в журналы веб-сервера (/var/log/apache2/error.log, так как Я использую Apache), и использую стандартный формат журнала (не тот форматер, который я обозначил). Я неправильно настраиваю логирование?

Ответы [ 4 ]

3 голосов
/ 03 июня 2010

В некотором роде анти-климакс, но оказывается, что в проекте было установлено стороннее приложение, которое имело собственную конфигурацию ведения журнала, которая переопределяла настройку, которую я настроил (по какой-то причине он изменил корневой регистратор - не очень кошерный для приложения Django!). Убрал этот код и все работает как положено.

2 голосов
/ 02 июня 2010

См. этот другой ответ . Обратите внимание, что settings.py обычно импортируется дважды, поэтому вам следует избегать создания нескольких обработчиков. Лучшая поддержка журналирования поступает в Django в версии 1.3 (надеюсь), но сейчас вы должны убедиться, что, если ваш установочный код вызывается более одного раза, никаких негативных последствий не будет.

Я не уверен, почему ваши зарегистрированные сообщения попадают в журналы Apache, если вы (где-то еще в вашем коде) не добавили StreamHandler в ваш корневой логгер с sys.stdout или sys.stderr в качестве потока. Возможно, вы захотите распечатать logging.getLogger().handlers, просто чтобы увидеть, что вы ожидаете увидеть.

2 голосов
/ 02 июня 2010

Я использовал это с успехом (хотя он не вращается ):

# in settings.py
import logging
logging.basicConfig(
    level = logging.DEBUG,
    format = '%(asctime)s %(levelname)s %(funcName)s %(lineno)d \
              \033[35m%(message)s\033[0m', 
    datefmt = '[%d/%b/%Y %H:%M:%S]',
    filename = '/tmp/my_django_app.log',
    filemode = 'a'
)

Я бы тоже предложил попробовать абсолютный путь.

0 голосов
/ 02 июня 2010

Я полагаю, что запись останавливается, когда Apache разветвляется. После того, как это произошло, поскольку все файловые дескрипторы были закрыты во время демонизации, система ведения журнала пытается повторно открыть файл журнала и, насколько я понимаю, использует относительный путь к файлу:

log_dir = os.path.join(PROJECT_DIR, "var", "log", "my_app")
log_name = os.path.join(log_dir, "nyrb.log")

Но нет «текущего каталога», когда процесс был демонизирован. Попробуйте использовать абсолютный log_dir путь. Надеюсь, это поможет.

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