2010-12-07 9 views
40

私のdjangoアプリケーションが実行したすべてのSQLクエリをどのように記録できますか?すべてのsqlクエリをログに記録

管理サイトからSQLを含むすべてをログに記録します。私はthis questiona FAQ answerを見たが、私は1つのファイルにすべてをログに記録する

from django.db import connection 
connection.queries 

を置くべき場所私はまだ把握することはできませんか?

私の質問は、 - すべてのSQL文がログに記録されるファイル(all-sql.logなど)を持つにはどうすればよいですか?

+0

http://stackoverflow.com/questions/1074212/how-to-show-the-sql-django-is-running –

答えて

11

多分それはあなたが特定のページによって生成されたすべてのクエリを見てみましょうよhttps://github.com/django-debug-toolbar/django-debug-toolbar

をチェックしてください。また、発生した場所のスタックトレースなど。

EDIT:すべてのSQLクエリをファイルなどに記録する場合は、ミドルウェアを作成する必要があります。ミドルウェアはすべての要求に対して実行されます。いくつかのDjangoはこの種のもののためにそこにスニペットがあります

者は、端末への印刷と懸念しているが、それらを適応させるのは難しいことではないでしょうPythonのロギングライブラリを使用します。

+0

おかげacardenas89 @から微調整。私はデバッグツールバーについて知っています。しかし、すべてのページ(すべてのページ)を1つのファイルに記録したいのです。 –

0

これをミドルウェアパッケージに入れる必要があります。ミドルウェアは、webserver/djangoコアとすべてのビューの間にあります。要求前に前処理を行い、要求が完了した後に後処理を行うことができます。たとえば、クエリをファイルに保存します。

https://docs.djangoproject.com/en/dev/topics/logging/#django-db-backends

7

ジャンゴ1.3ログ次のスニペットをLOGGINGフィールあなたのsettings.pyでD:

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

答え

35

settings.py

 

if DEBUG: 
    import logging 
    l = logging.getLogger('django.db.backends') 
    l.setLevel(logging.DEBUG) 
    l.addHandler(logging.StreamHandler()) 
 

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     } 
    }, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler' 
     },'console': { 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
     }, 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     },'django.db.backends.sqlite3': { 
      'level': 'DEBUG', 
      'handlers': ['console'], 
     }, 
    } 
} 
   

Resource/Credit

+8

上部に 'if'ステートメントと' LOGGING'ステートメントの両方を必要としません。 'if'ステートメントは、あなたがロギングを追加したいときなどに使用します。あなたがsettings.pyに必要なのは、 'LOGGING'の変更だけです - あなたはsqlite3特有のものではなく' django.db.backends'が好きかもしれません。 –

+0

django 1.9を実行しているコンソールでクエリが表示されません。 'DEBUG = True'です。 –

67

に次の太字のステートメントを追加します。django.db.backendsロガーへのすべてのSQL文が

+1

ハンドラ 'console'を追加するために_Unableを取得する場合は、次のように 'handlers'セクションに以下を追加する必要があります: 'console'_ error:'' console ':{ 'level': 'DEBUG'、 'class': 'logging.StreamHandler'、 'フォーマッタ': '冗長'、 'ストリーム':sys.stderr、 }、 ' –

+0

「バージョン」: 1、 'LOGGING'のdictにあります。 – Dan

+2

テストを実行するときになぜこれが機能しないのですか? – Andy

関連する問題