用于视图的python日志装饰器

时间:2011-08-18 21:24:32

标签: python django logging view decorator

我想编写装饰器的常用功能如下:

在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。

由于某种原因,我的日志消息未显示在文件中。 except子句中的“print”消息显示在控制台中。如果我在视图中使用日志消息,它会显示,因此日志记录配置正常。如果有人能指出这一点,我一定会错过一些简单的事情,我会很感激!

感谢名单!

发布日志配置文件:

[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 个答案:

答案 0 :(得分:1)

请勿在您的观看中致电fileConfig:按settings.pymy answer的建议,在另一个问题中执行此操作。您的视图代码应该只包含用于定义记录器的代码(正如您已经拥有的)以及日志记录调用本身。在您做出此更改后发布您的发现。

另外,请勿在自己的问题上发表评论。您应该能够将问题编辑为例如添加日志配置文件,并且能够比评论中更好地格式化它。