2013-06-14 35 views
8

Tôi hiện đang đăng nhập tất cả các truy vấn SQL nhờ vào các thiết lập đăng nhập sau:Django lọc log cho SQL chậm truy vấn

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 
     }, 
    } 
} 

Những gì tôi thực sự nhận được trong logfile của tôi là:

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

Tôi muốn chỉ muốn lọc các truy vấn mất trên 300 mili giây để hoàn tất.

Tôi nên viết phần filters trong cấu hình đăng nhập của mình như thế nào và lớp học sẽ hoạt động như thế nào?

Trả lời

6

Cho đến nay, tôi đã cố gắng sử dụng một CallbackFilter nhưng tôi muốn có một lớp đăng nhập.

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

Điều này rất hữu ích! Sửa đổi duy nhất tôi thực hiện là [đặt bộ lọc trên nhật ký] (https://docs.python.org/2/library/logging.html#filter-objects) ({{'django.db.backends'}} trong trường hợp của tôi) thay vì trên trình xử lý. – tutuDajuju

+0

là có cách nào để xây dựng stacktrace là tốt? vì vậy chúng tôi biết nơi truy vấn đã xảy ra? –

0

Bạn có thể sử dụng một bộ lọc để gắn 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 

Thêm vào danh sách filters bạn và sau đó sử dụng nó với các logger:

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

Có thể yêu cầu Python 3 cho xử lý stack_info, nhưng cũng có thể sử dụng trình định dạng tùy chỉnh .

Các vấn đề liên quan