2013-06-14 11 views
8

Jestem obecnie zalogowaniu wszystkie zapytań SQL dzięki następujących ustawień rejestrowania:Django filtr dziennika powolnego zapytań SQL

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     } 
    }, 
    'formatters': { 
     'standard': { 
      'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s", 
      'datefmt' : "%d/%b/%Y %H:%M:%S" 
     }, 
    }, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler' 
     }, 
     'console': { 
      # logging handler that outputs log messages to terminal 
      'class': 'logging.StreamHandler', 
      'level': 'DEBUG', # message level to be written to console 
     }, 
     'logfile': { 
      'level':'DEBUG', 
      'class':'logging.handlers.RotatingFileHandler', 
      'filename': os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "log", "logfile"), 
      'maxBytes': 50000, 
      'backupCount': 2, 
      'formatter': 'standard', 
     }, 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
     'django.db': { 
      'handlers': ['logfile'], 
      'level': 'DEBUG', 
      'propagate': False,   # django also has database level logging 
     }, 
    } 
} 

Co tak naprawdę się w moim dzienniku jest:

[14/Jun/2013 13:54:19] DEBUG [django.db.backends:51] (0.000) SELECT "django_content_type"."id", "django_content_type"."name", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE "django_content_type"."app_label" = sites ORDER BY "django_content_type"."name" ASC; args=(u'sites',) 

ja lubię filtrować tylko zapytania, które trwają ponad 300 ms.

Jak mam napisać sekcję filters mojej konfiguracji logowania i jaka będzie wyglądała klasa, która wykonuje filtrowanie?

Odpowiedz

6

Do tej pory próbowałem użyć CallbackFilter, ale wolałbym mieć klasę rejestrowania.

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'queries_above_300ms': { 
      '()': 'django.utils.log.CallbackFilter', 
      'callback': lambda record: record.duration > 0.3 # output slow queries only 
     }, 
    }, 
    'formatters': { 
     'standard': { 
      'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s", 
      'datefmt' : "%d/%b/%Y %H:%M:%S" 
     }, 
    }, 
    'handlers': { 
     'logfile': { 
      'level':'DEBUG', 
      'class':'logging.handlers.RotatingFileHandler', 
      'filename': os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "log", "logfile"), 
      'maxBytes': 50000, 
      'backupCount': 2, 
      'formatter': 'standard', 
      'filters': ['queries_above_300ms'], 
     }, 
    }, 
    'loggers': { 
     'django.db': { 
      'handlers': ['logfile'], 
      'level': 'DEBUG', 
      'propagate': False, 
     }, 
    } 
} 
+0

Jest to bardzo pomocne! Jedyną modyfikacją, którą wprowadziłem, było [ustawienie filtru w loggerze] (https://docs.python.org/2/library/logging.html#filter-objects) ({{'django.db.backends'}} w mój przypadek) zamiast na treserze. – tutuDajuju

+0

Czy istnieje również sposób na zbudowanie stosu stacktrace? więc wiemy, gdzie pojawiło się zapytanie? –

0

Można użyć filtru, aby dołączyć stack_info:

class SlowQueriesFilter(logging.Filter): 
    """Filter slow queries and attach stack_info.""" 

    def filter(self, record): 
     duration = record.duration 
     if duration > 0.1: 
      # Same as in _log for when stack_info=True is used. 
      fn, lno, func, sinfo = logging.Logger.findCaller(None, True) 
      record.stack_info = sinfo 
      return True 
     return False 

dodać go do swojej listy filters a następnie używać go z rejestratora:

LOGGING = { 
    'filters': { 
     'slow_queries': { 
      '()': 'app.log_filters.SlowQueriesFilter', 
     }, 
    }, 
    'loggers': { 
     'django.db.backends': { 
      'level': 'DEBUG', 
      'filters': ['slow_queries'], 
     } 
    } 

może wymagać Python 3 dla Można również użyć obsługi stack_info, ale niestandardowego formatyzatora .

Powiązane problemy