2013-06-14 12 views
8

aşağıdaki KAYITLARI ayarlarına sayesinde sorgular sorgularDjango günlük filtresi Şu anda tüm SQL günlüğü am

[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',) 

ben istiyorum Tamamlamak için yalnızca 300 ms'nin üstündeki sorguları filtrelemek gibi.

nasıl günlüğü yapılandırma filters bölümüne yazmalısınız ve filtreleme yapmak sınıfı gibi bir şey olurdu?

cevap

6

Şimdiye kadar, ben bir CallbackFilter kullanmayı denedim ama günlük sınıfını sahip tercih ediyorum.

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, 
     }, 
    } 
} 
Sen stack_info takmak için bir filtre kullanabilirsiniz
+0

Bu çok yararlı! Ben yapılan tek modifikasyon (https://docs.python.org/2/library/logging.html#filter-objects) ({{ 'django.db.backends}} içinde [kaydedicisi üzerinde filtre ayarlamak] edildi Benim durumum) yerine işleyici. – tutuDajuju

+0

stacktrace'i oluşturmanın herhangi bir yolu var mı? sorgunun nerede olduğunu biliyoruz? –

0

:

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 

sizin filters listenize ekleyin ve sonra kaydedicisi ile kullanmak:

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

için Python 3 gerektirir Olabilir stack_info işleme, ancak özel bir biçimlendirici da kullanılabilir.

İlgili konular