python:每当我想要时如何启动和停止记录器 [英] python: How to start and stop a logger whenever i want

查看:147
本文介绍了python:每当我想要时如何启动和停止记录器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Django应用程序中的代码中记录sql语句

I am trying to log sql statements in a code in my Django Application

当前,我在settings.py中使用以下记录器配置.

Currently i am using the following logger config in my settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'sql': {
            '()': SQLFormatter,
            'format': '[%(duration).3f] %(statement)s',
        },
        'verbose': {
            'format': '%(levelname)s %(funcName)s() %(pathname)s[:%(lineno)s] %(name)s \n%(message)s'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'formatter': 'verbose',
            'class': 'logging.StreamHandler',
        },
        'sql': {
            'class': 'logging.StreamHandler',
            'formatter': 'sql',
            'level': 'DEBUG',
        }
    }
}

在一般情况下,在django中记录sql时,我们可以将django.db.backends添加到settings.py中的logger.config中.

In genereal to log sql in django we can add the django.db.backends to the logger.config in the settings.py

 'loggers': {
    'django.db.backends': {
        'handlers': ['sql'],
        'level': 'DEBUG',
        'propagate': False,
    },

但是问题是它将记录每个sql语句.因此,如何在代码之间启动和停止django.db.backends的日志记录.

But the problem is it will log every sql statement. So how can we start and stop logging for django.db.backends in between code.

我的views.py

I have the following code in my views.py

def someview(request)
    # start logging from here
    user_set = User.objects.all()
    for user in user_set:
        print(user.last_name) 
    # stop logging from here

我还想使用在日志记录配置中定义的sql处理程序.

Also I want to use the sql handler which I defined in the logging config.

在上面的视图功能中,什么代码将在开始和停止记录的地方出现.

What code will go in start and stop logging place in the above view function.

推荐答案

创建过滤器类,并将实例添加到记录器或处理程序.

Create a filter class and add an instance to the logger or handler.

class LoggerGate:
    def __init__(self, state='open'):
        self.state = state

    def open(self):
        self.state = 'open'

    def close(self):
        self.state = 'closed'

    def filter(self, record):
        return self.state == 'open'

创建一个过滤器,该过滤器在关闭"状态下初始化. 获取"django.db.backends"记录器并添加过滤器.

Create a filter, initialized in the 'closed' state. Get the 'django.db.backends' logger and add the filter.

gate = LoggerGate('closed')
sql_logger = logging.getLogger('django.db.backends')
sql_logger.addFilter(gate)

然后调用openclose方法以将日志记录限制在所需的位置.

Then call the open or close method to limit logging to where you want it.

def someview(request)
    gate.open()      # start logging from here

    user_set = User.objects.all()
    for user in user_set:
        print(user.last_name) 

    gate.close()     # stop logging here

这篇关于python:每当我想要时如何启动和停止记录器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆