Python Logging Decorator для просмотров - PullRequest
4 голосов
/ 19 августа 2011

Обычная функциональность, для которой я хотел бы написать декоратор:

в виде django, у меня есть следующий код:

def view(request):
    try:
       # do stuff and return success case view response
       return render_to_response(...)
    except:
       # log the exception stack trace and return error case view response
       logger.error('...')
       return render_to_response('user friendly error message etc.')

Я бы хотел извлечь блок "try", кроме блока, в декоратор. Поэтому я написал что-то вроде следующего:

import logging.config
logging.config.fileConfig(LOGGING_CONFIG_FILE)
logger = logging.getLogger(__name__)   

def decorator(view):
    def inner(*args, **kwargs):
        try:            
            return view(*args, **kwargs)
        except:
            exception_traceback = traceback.format_exc(5)
            error_message = 'Exception:%s' % exception_traceback
            print 'Unexpected error occurred: %s' %(exception_traceback)
            logger.error( 'Unexpected error occurred: %s' %(exception_traceback))
            return render_to_response('error.json',
                              {
                                'message': 'Unexpected system error occured - please contact system administrator'
                              },
                              mimetype='text/plain')
    return inner

Предположим, что обычно я возвращаю json и в случае успеха.

По какой-то причине мое сообщение не отображается в файле. Сообщение «print» в предложении exc отображается в консоли. Если я использую сообщение регистрации в самом представлении, оно появляется, таким образом, конфигурация регистрации в порядке. Я, должно быть, упускаю что-то простое, если кто-то может указать на это, был бы признателен!

Thanx!

Отправка файла конфигурации регистрации:

[loggers]
keys=root

[logger_root]
handlers=screen,file
level=DEBUG

[formatters]
keys=simple,complex

[formatter_simple]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

[formatter_complex]
format=%(asctime)s - %(levelname)s - %(module)s : %(lineno)d - %(message)s

[handlers]
keys=file,screen

[handler_file]
class=handlers.RotatingFileHandler
formatter=complex
level=DEBUG
args=('/tmp/rule150/logs/rule150.log','a',1000000,5)

[handler_screen]
class=StreamHandler
formatter=simple
level=INFO
args=(sys.stdout,)

1 Ответ

1 голос
/ 19 августа 2011

Не звоните fileConfig в ваших взглядах: сделайте это в settings.py, как рекомендовано в мой ответ на другой вопрос. Ваш код представления должен содержать только код для определения регистратора (как он у вас уже есть), а также сами вызовы регистрации. Опубликуйте результаты после внесения этих изменений.

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

...