вход в Python в Django - PullRequest
       15

вход в Python в Django

0 голосов
/ 30 ноября 2009

Я использую базовый Python Logger в Django, и это, кажется, работает хорошо. У меня есть настройки регистрации в моем setting.py как;

logging.baseConfig(level = logging.NOTSET,    
                   format='a format',    
                   datemt=' a datefmt',    
                   filename='path to log',    
                   filemode = 'a')    
logging.getLogger('').setLevel(logging.NOTSET)    

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

try:
    do stuff
except Exception, e:
    logging.error(e)
    raise

но я обнаружил, что это приводит к тому, что исключение регистрируется дважды. Есть ли другой способ сделать это, или я делаю что-то не так?

Привет
Andrew

Ответы [ 2 ]

1 голос
/ 30 ноября 2009

Нет необходимости перехватывать исключение , просто , чтобы вы могли его зарегистрировать. Вы можете войти и обработать это, или позволить этому пузыриться до некоторого более высокого уровня, который зарегистрирует это и обработает это. Если вы хотите регистрировать исключения, возникающие в некотором представлении, которое вы не хотите обрабатывать, вы можете установить некоторое промежуточное программное обеспечение исключения , которое регистрирует исключение и либо возвращает пользовательский ответ, который вы определили, либо None (чтобы вернуть любой ответ, который обычно возвращает Django).

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

class MyExceptionMiddleware:

    def process_exception(self, request, exception):
        #Do your logging here

Также обратите внимание, что у регистраторов есть метод exception(), который работает как error(), но включает в себя информацию трассировки в журнале.

0 голосов
/ 30 ноября 2009

Есть рецепт: http://code.activestate.com/recipes/466332/

В любом довольно сложном приложении вы, вероятно, захотите регистрировать и обрабатывать большинство исключений. В рецепте показан способ отделить ведение журнала от обработки, поэтому нет необходимости явно вызывать механизм ведения журнала в каждом предложении try-exc.

...