Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Log SQL queries even if DEBUG=False

This is my logging config in settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
        'file': {
            'class': 'logging.FileHandler',
            'filename': os.path.join(BASE_DIR, 'logs', 'django.log'),
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        },
        'django.template': {
            'handlers': ['file', 'console'],
            'level': 'INFO',
        },
        'App': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        },
    },
}

There's a behavior that I can't explain: if I run with debug=True I can see all SQL queries being logged to the console, but when debug=False that doesn't happen, even if I don't change the configuration above.

Why is this? How can I determine in my logging config whether or not SQL queries are logged to the console?

like image 623
Saturnix Avatar asked Jun 19 '26 05:06

Saturnix


1 Answers

Query logging goes way deeper as Django wraps the database cursor based on the truthiness of a computed property.

From Line 226, django.db.backends.base.base v2.2.6 sources

def _prepare_cursor(self, cursor):
    """
    Validate the connection is usable and perform database cursor wrapping.
    """
    self.validate_thread_sharing()
    if self.queries_logged:
        wrapped_cursor = self.make_debug_cursor(cursor)
    else:
        wrapped_cursor = self.make_cursor(cursor)
    return wrapped_cursor

This computed property gets to be decided on where debugging is forced or debugging is enabled in project settings

From Line 149, django.db.backends.base.base v2.2.6 sources

@property
def queries_logged(self):
    return self.force_debug_cursor or settings.DEBUG

You should be able to get a proxy to the default connection and force the debug cursor to be used.

from django.db import connection

connection.force_debug_cursor = True

I however advise against this approach and favor query audits in the database.

like image 102
Oluwafemi Sule Avatar answered Jun 22 '26 01:06

Oluwafemi Sule



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!