Django загадочная запись на журнал - PullRequest
0 голосов
/ 05 марта 2019

Я установил papertrail для проекта Django, но регистрация не удалась с OSError: [Errno 9] Bad file descriptor.Странно то, что если я позвоню django.setup() перед вызовом регистрации, это сработает ...

settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'json': {
            '()': 'pythonjsonlogger.jsonlogger.JsonFormatter',
             'fmt': '%(levelname)s %(asctime)s %(message)s',
         },
    },
    'handlers': {
        'papertrail': {
            'level': 'DEBUG',
            'class': 'logging.handlers.SysLogHandler',
            'formatter': 'json',
            'address': ('logsN.papertrailapp.com', 12345)
         },
    ...
    },
    'loggers': {
        'papertrail': {
            'handlers': ['papertrail'],
            'level': 'ERROR',
            'propagate': True,
         },
    ...

/ management / commands/logging_test.py

from django.core.management import BaseCommand
import django
import logging

#  uncomment this line to make it work
#django.setup()


def test_logging():
    logger = logging.getLogger('papertrail')
    logger.error(
        'TEST LOGGING'
    )


class Command(BaseCommand):
    def handle(self, *args, **options):
        test_logging()

Я могу вызвать функцию test_logging с помощью:

./manage.py test_logging

Если я раскомментирую строку django.setup(), она будет работать.Понятия не имею почему.

1 Ответ

0 голосов
/ 05 марта 2019

Посмотрите документы для django.setup(), и вы увидите, что одна из главных ролей этой функции - настроить ведение журнала в соответствии с вашими настройками. В этой части документации упоминается сценарий, в котором использование django.setup () требуется для ведения журналов:

Если вы используете компоненты Django «standalone» - дляНапример, написание скрипта Python, который загружает некоторые шаблоны Django и отображает их, или использует ORM для извлечения некоторых данных - есть еще один шаг, который вам понадобится в дополнение к настройке параметров.

Я могу 'Я не могу сказать, что делает ваш проект, но тест, который вы выполняете, кажется, попадает в категорию «автономных».

Просмотр источника django.setup() частично вызывает следующее

configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)

И источник для этой функции делает следующее:

def configure_logging(logging_config, logging_settings):
    if logging_config:
        # First find the logging configuration function ...
        logging_config_func = import_string(logging_config)

        logging.config.dictConfig(DEFAULT_LOGGING)

        # ... then invoke it with the logging settings
        if logging_settings:
            logging_config_func(logging_settings)
...