Вопрос по – простое сообщение об ошибке в Django

0

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

Например, в моем приложении есть условие, что если в БД чего-то не существует, о котором я хочу знать, но у меня есть подходящее значение по умолчанию, которое будет работать нормально. Таким образом, я хочу, чтобы мне отправили письмо с некоторой информацией; это не обязательно происходит в исключении.

Если я сделаю что-то вроде этого:

logger.error («плата не существует в базе данных для действия% s», «действиеX»)

Информация в журнале в порядке, но в электронном письме действительно не хватает информации. Вот тема вопроса:

[Django] ERROR: Test this jazz %s

А потом тело:

None

Request repr() unavailable

Мой вопрос заключается в том, как мне получить A) значение, отображаемое в теме, и B) получить некоторую актуальную, актуальную информацию в теле .... как номер строки или что-то в этом роде.

Чтобы лучше помочь, не могли бы вы опубликовать свой конфиг для вашего логгера (из settings.py)? jvc26

Ваш Ответ

2   ответа
0

Django Logging docs государство:

Of course, it isn't enough to just put logging calls into your code. You also need to configure the loggers, handlers, filters and formatters to ensure that logging output is output in a useful way.

Вам нужно настроить свои настройки в вашемlogging.config () толковый словарь. Это позволяет вам точно указать, какую информацию вы хотите и как форматировать.

Вырезаем немного из документов:

'formatters': {
    'verbose': {
        'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
    },

Дает вам представление о том, как вы можете повлиять на вывод, и документы logging.config для python заполнят доступные параметры.

Error: User Rate Limit Exceeded JamesD
4

You want to send an email using Python's builtin logging system and You are not logging a regular exception so the builtin mechanism for sending emails won't work since it's depending on an exception type-like object to be passed and stuff to be stored in a traceback.

В любом случае, не невозможно!

LOGGING = {
   ...
   'handlers': {
        ...
        'my_special_mail_handler': {
            'level': 'ERROR',
            'filters': [],
            'class': 'myapp.loggers.MyEmailHandler',
            'include_html': False,
        },
    },
    'loggers': {
        ...
        'my_special_logger': {
            'handlers': ['console', 'my_special_mail_handler'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

MY_RECIPIENTS = (("Name of person", "[email protected]"),)

... этот материал слился с вашими настройками.

Затем есть ваш специальный класс ведения журнала, MyEmailHandler:

from django.utils.log import AdminEmailHandler
from django.core.mail.message import EmailMultiAlternatives
from django.conf import settings

class MyEmailHandler(AdminEmailHandler):

    def emit(self, record):
        if not getattr(settings, "MY_RECIPIENTS", None):
            return
        subject = self.format_subject(record.getMessage())
        message = getattr(record, "email_body", record.getMessage())
        mail = EmailMultiAlternatives(u'%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject),
                    message, settings.SERVER_EMAIL, [a[1] for a in settings.MY_RECIPIENTS],)
        mail.send(fail_silently=False)

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

import logging
logger = logging.getLogger("my_special_logger")
error = logger.makeRecord(
    logger.name, logging.ERROR, 0, 0,
    u"Subject: Some error occured",
    None, None, "", None,
)
error.email_body = msg
logger.handle(error)

и чтобы упростить процесс, воспользуйтесь утилитой:

import logging
def my_log(msg, body, level=logging.ERROR):
    logger = logging.getLogger("my_special_logger")
    error = logger.makeRecord(
        logger.name, level, 0, 0,
        u"Subject: Some error occured",
        None, None, "", None,
    )
    error.email_body = msg
    logger.handle(error)
Error: User Rate Limit Exceeded JamesD

Похожие вопросы