加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

用于视图的python日志装饰器

发布时间:2020-12-20 13:24:27 所属栏目:Python 来源:网络整理
导读:我想编写装饰器的常用功能如下: 在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 respons
我想编写装饰器的常用功能如下:

在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,)

解决方法

不要在视图中调用fileConfig:在settings.py中执行此操作,如 my answer中建议的那样.您的视图代码应该只包含用于定义记录器的代码(正如您已经拥有的)以及日志记录调用本身.完成此更改后发布您的发现.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读