tüm sql sorgularını günlüğe kaydet


98

Django uygulamamın gerçekleştirdiği tüm SQL sorgularını nasıl günlüğe kaydedebilirim?

Yönetici sitesindeki SQL'ler dahil her şeyi günlüğe kaydetmek istiyorum. Bu soruyu ve bir SSS cevabını gördüm ancak hala nereye koymam gerektiğini bulamıyorum

from django.db import connection
connection.queries

her şeyi tek bir dosyaya kaydetmek için?

Öyleyse sorum şu - tüm SQL ifadelerinin günlüğe kaydedildiği bir dosyaya (örneğin all-sql.log) sahip olmak için ne yapmalıyım?


Yanıtlar:


19

Belki https://github.com/django-debug-toolbar/django-debug-toolbar'a bakın

Belirli bir sayfa tarafından oluşturulan tüm sorguları görmenize izin verir. Yanı sıra meydana geldikleri yerlerin yığın izleri vb.

DÜZENLEME: tüm SQL sorgularını bir dosyaya vb. Kaydetmek için, daha sonra bir ara katman yazılımı oluşturmak isteyeceksiniz. Ara yazılım her istek üzerine çalıştırılır. Bu tür şeyler için orada birkaç Django parçacığı var:

Bunlar terminale yazdırmayla ilgileniyorlar, ancak onları python'un günlük kütüphanesini kullanmaya uyarlamak zor olmayacaktır.


177

Aşağıdaki parçacığı aşağıdaki LOGGINGalanla birleştirin settings.py:

LOGGING = {
    'version': 1,
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
            'handlers': ['console'],
        }
    }
}

@ Acardenas89 yanıtından ince ayar yapıldı


3
İşleyici 'konsol' eklenemiyor: 'konsol' hatasıyla karşılaşırsanız aşağıdakileri handlersbölüme eklemeniz gerekebilir : 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
Don Grem

1
Ben de gerekli 'version': 1,de LOGGINGdict.
Dan

12
Günlüklerin gerçekten günlüğe kaydedilmesi için HATA AYIKLAMA'nın DOĞRU olması gerektiğini lütfen unutmayın . Günlük ayarlarından bağımsız olarak.
Janusz Skonieczny

3
Ah, Django sınama koşucuyla bir şey daha ayarları ve geçersiz kılmaları yok sayar ve DEBUGhiç Falseböylece gerekir testinde,@override_settings(DEBUG=True)
Janusz SKONIECZNY

7
Ayrıca , etkin bir kök kaydediciniz varsa ve bunun neden iki kez yazdırıldığını bilmiyorsanız 'propagate': False, 'handlers': ['console'],satırdan sonra da eklerim . Farkına varmam biraz zaman aldı.
Andrei-Niculae Petre

44

Settings.py'de aşağıdaki kalın ifadeleri ekleyin


HATA AYIKLA ise:
    içe aktarma günlük kaydı
    l = logging.getLogger ('django.db.backends')
    l.setLevel (logging.DEBUG)
    l.addHandler (logging.StreamHandler ())


LOGGING = {
    'versiyon 1,
    'disable_existing_loggers': Yanlış,
    "filtreler": {
        "require_debug_false": {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    "işleyiciler": {
        "mail_admins": {
            "düzey": "HATA",
            'filtreler': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }, "konsol": {
            'level': 'HATA AYIKLA',
            'class': 'logging.StreamHandler',
        } ,
    },
    "kaydediciler": {
        'django.request': {
            'işleyiciler': ['mail_admins'],
            "düzey": "HATA",
            'propagate': Doğru,
        }, 'django.db.backends.sqlite3': {
            'level': 'HATA AYIKLA',
            'işleyiciler': ['konsol'],
        } ,
    }
}
  

Kaynak / Kredi


9
Hem ifüstteki ifadeye hem de LOGGINGdeğişikliklere ihtiyacınız yok . ifDeyimi kabuğunda örn iken günlüğü eklemek istiyorsanız, hemen açmak için - eğer settings.py içinde gereken tek şey LOGGINGdeğişir - ve de isteyebilirsiniz django.db.backendsdeğil Sqlite3 belirli bir,.
M Somerville

Django 1.9'u çalıştıran konsolda herhangi bir sorgu görmüyorum. DEBUG = True.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 Bu gerçekten eski bir yorum, muhtemelen Django 1.9 bu çözümü aynı şekilde desteklemiyor.
2016

Django 1.9'da, DEBUGtestler çalıştırılırken ayar Yanlış olmaya zorlanır. Çözüm, testte yeniden etkinleştirmek
Mouscellaneous


7

Test sırasında SQL sorgularını günlüğe kaydetmek için iki şeye ihtiyacınız vardır:

  1. django.db.backends kaydedici etkinleştirildi ve
  2. @override_settings(DEBUG=True) dekoratör.

Test çalıştırıcısı, DJANGO_SETTINGS_MODULE'da ne ayarlamış olabileceğinizi göz ardı ederek DEBUG = False varsayılan olarak ayarlayacaktır.

Minimum ayarlar:

# https://docs.djangoproject.com/en/dev/ref/settings/#logging
LOGGING = {
    'version': 1,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
        },
    },
    'root': {
        'handlers': ['console'],
    }
}

Örnek test senaryosu:

from django.contrib.auth.models import User
from django.test import TestCase, override_settings


class UserTests(TestCase):

    # To log queries in tests you need to manually override DEBUG setting
    # because testing sets DEBUG=False by default

    @override_settings(DEBUG=True)
    def test_create_user(self):
        User.objects.create()

2

Sadece ihtiyacın var:

@override_settings(DEBUG=True)

zaten yazdırılan SQL hata ayıklama ifadeleriniz varsa runserver.

Dekoratörü class TestA(TestCase)veya test_function:

@override_settings(DEBUG=True)
class TestA(TestCase):
...

    @override_settings(DEBUG=True)
    def test_function(self):
    ...

@ Janusz Skonieczny'nin cevabına kredi!


0

Bunu bir ara yazılım paketine koymanız gerekiyor. Ara yazılım, web sunucusu / django çekirdeği ile tüm görünümleriniz arasında bulunur. Talep öncesinde ön işlem, talep tamamlandıktan sonra son işlem yapabilir. Örneğin, sorguları bir dosyaya kaydedin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.