Подтвердить что ты не робот

Регистрация Django на Heroku

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

В моем коде я регистрирую несколько частей, например, внутри try-except или записывать некоторую информацию из команд управления. Я делаю очень нормальный материал, который работает с несколькими локальными установками и на некоторых серверах Nginx.

Файл python, подобный этому:

import logging
logger = logging.getLogger(__name__)
logger.info('some important infos')

Со следующим минимальным параметром settings.py(я пробовал без указания потока, без указанных журналов, с именованными регистраторами, почти всеми возможными комбинациями, и я также пробовал гораздо более сложные)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'stream': sys.stdout
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
            'level': 'INFO',
        },
        '': {
            'handlers': ['console'],
            'level': 'INFO',
        }
    }
}

Затем также просто протестирован из оболочки heroku run python

import logging
level = logging.INFO
handler = logging.StreamHandler()
handler.setLevel(level)
handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
logger = logging.getLogger('info')
logger.addHandler(handler)
logger.setLevel(level) #even if not required...
logger.info('logging test')

Последний может отображаться как оператор "print" в консоли, но ни здесь, ни из команды или сервера ничего не появляется в heroku logs....

EDIT: на самом деле у меня есть некоторые записи, показывающие журналы приложений, например следующие, просто не мои:

2013-09-20T15:00:16.405492+00:00 heroku[run.2036]: Process exited with status 0
2013-09-20T15:00:17+00:00 app[heroku-postgres]: source=HEROKU_POSTGRESQL_OLIVE sample[...]
2013-09-20T14:59:47.403049+00:00 heroku[router]: at=info method=GET path=/
2013-09-20T14:59:16.304397+00:00 heroku[web.1]: source=web.1 dyno=heroku [...]

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

Ну, я не знаю, что я мог бы попробовать еще... Спасибо за любой намек

4b9b3361

Ответ 1

Вход в Heroku из Django может быть сложным сначала, но на самом деле это не так ужасно, чтобы его настроить.

Это следующее определение регистрации (входит в ваш файл настроек) определяет два форматирования. Многословный соответствует формату протоколирования, который использует сам Героку. Он также определяет два обработчика, нулевой обработчик (не обязательно должен использоваться) и обработчик консоли - консольный обработчик - это то, что вы хотите использовать с Heroku. Причиной этого является то, что регистрация на Heroku работает простым регистратором потока, регистрируя любой вывод, сделанный в stdout/stderr. Наконец, я определил один регистратор под названием testlogger - эта часть определения журнала выглядит как обычная для определения протоколирования.

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': ('%(asctime)s [%(process)d] [%(levelname)s] ' +
                       'pathname=%(pathname)s lineno=%(lineno)s ' +
                       'funcname=%(funcName)s %(message)s'),
            'datefmt': '%Y-%m-%d %H:%M:%S'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        }
    },
    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class': 'logging.NullHandler',
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        'testlogger': {
            'handlers': ['console'],
            'level': 'INFO',
        }
    }
}

Далее, как это использовать. В этом простом случае вы можете сделать следующее в любом другом файле в проекте Django, чтобы записать этот конкретный логгер, который мы определили (testlogger). Помните, что по определению регистратора в нашем файле настроек будет выведено любое сообщение журнала INFO или выше.

import logging
logger = logging.getLogger('testlogger')
logger.info('This is a simple log message')

Ответ 2

Вам нужно "активировать" ваших регистраторов вручную. Вы можете сделать это для каждого модуля, например, "blog.views". Он подберет подмодули, поэтому для регистрации всего приложения для блога просто введите "блог".

Если вы оставите его пустым, он будет регистрировать все, что не обрабатывалось до и с распространением = True (не по умолчанию). Это также будет записывать все Django, что означает, что на уровне отладки вы получите SQL-запросы в своих журналах.

'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'blog.views': {
            'handlers': ['console'],
        },
        'blog': {
            'handlers': ['console'],
        },
        '': {
            'handlers': ['console'],
            'level': 'DEBUG',  # Not recommended.
        }
    }

Ответ 3

В моем случае у меня была правильная настройка ведения журнала

LOGGING = {...}

К сожалению, это игнорировалось, потому что в нижней части моего установочного файла я звонил

django_heroku.settings(locals())

Это переписывало мои настройки ведения журнала, поэтому решение было

django_heroku.settings(locals(), logging=False)

Выглядит так, как будто он может отключить ведение журнала, но на самом деле он просто пропускает собственную конфигурацию ведения журнала heroku.


В качестве примечания, я бы использовал этот код при отладке проблем с журналированием Django, потому что он должен более или менее всегда работать со значениями по умолчанию Django:

import logging
logger = logging.getLogger('django.server')
logger.error('some important infos')

См. Django стандартная конфигурация регистрации

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