2017-06-23 19 views
3

ヘッダを追加する方法を探して、私のviews.pyDjangoのエラーログ:追加のリクエストヘッダー、本文およびユーザー情報

での例外のスタックトレースと一緒に私のエラーログで体とユーザーの電子メールアドレス

ウェブを何時間も精査した後で、多くの人が自分のミドルウェアを書くことを提案し、その中にはその種の情報を別のログに記録するよう提案されたものもあります。しかし、コードがどこに間違っていたのかを知ることで、問題の1つの部分が解決され、影響を受けた悪い魂とその例外の間に送信された要求データを特定することは、問題を解決するための長い道のりになります。その情報を同じログファイルに入れておくだけで意味があります。このセットアップはしばらくの間、よく働い

from django.db.models import Min, Max, Q, F, Count, Sum 
from django.db import connection 
from django.conf import settings 
from django.http import HttpResponse, HttpResponseRedirect 
from myapp.models import * 
import logging 

logging.basicConfig(filename="errors.log", 
        level=logging.ERROR, 
        format='%(asctime)s: %(message)s') 


def random_view(request): 
    if request.user.is_authenticated() and request.user.is_active: 
     # generic view code goes here. 
    else: 
     return HttpResponse(status=401) 

は、現在、私のviews.pyに、私はこの簡単なセットアップを持っています。例外が発生するたびに、例外エラーメッセージとスタックトレースをログアウトします。

また、どのようにrequest.META、request.user.idとrequest.bodyをスタックトレースと共に追加できますか?

提案があれば助かります。うまく答えが出て、さらに良い!

ありがとうございました

+0

https://stackoverflow.com/questions/35152435/how-to-ignore-the-exception-which-are-generated-during-the-logging-in-pythonを試しましたか –

+0

私はあなたが調べるべきだと思います従来のソート、例えばhttps://stackoverflow.com/a/44688358/3627387 –

答えて

3

私はあなたが持っているロギング問題の完全な解決策はミドルウェアを実装することだと思います。ミドルウェアは、クラスベースのビュー、関数ベースのビュー、DRFのAPIViewのいずれであっても、あなたが持っているあらゆるビューインプリメンテーションで動作することができます。

完全ロギングのためにミドルウェアを定義できます。あなたが認証ミドルウェア後に適切にミドルウェアを置くことを確認します -

MIDDLEWARE = [ 
    ..., 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    ..., 
    'path.to.your.middleware.LogMiddleware' 
] 

ログミドルウェアでは、リクエストとレスポンスへのアクセスを持っているでしょう。要求、ユーザー(認証されている場合)、およびロガーを介して要求から来るすべてのMETAプロパティを格納することができます。また、必要に応じてデータベースに格納することもできます。データベースへの格納にはコストがかかりますが、注意してください。ミドルウェアの作成方法については、Django middleware documentationを参照してください。

import traceback 

class LogMiddleware(): 
    def __init__(self, get_response): 
     self.get_response = get_response 

    def __call__(self, request): 
     try: 
      return self.get_response(request) 
     except: 
      if request.user.is_authenticated(): 
       # Log the user 
      path = request.get_full_path() # Get the URL Path 
      tb = traceback.format_exc() # Get the traceback 
      meta = request.META # Get request meta information 
      # Log everything 
      raise # Raise exception again after catching 

あなたはHttpRequestのDjangoのドキュメントから存在に関するすべてのメタ属性を読み取ることができます。これについて何らかの説明が必要な場合はお知らせください。

2

ここではデコレータを使用します。ストレートコードにカット...

import logging 
from functools import wraps 
from django.http import HttpResponse, HttpRequest 

logging.basicConfig(filename="errors.log", 
        level=logging.ERROR, 
        format='%(asctime)s: %(message)s') 
log = logging.getLogger(__name__) 

def log_exceptions(wrapped): 
    @wraps(wrapped) 
    def wrapper(*args, **kwargs): 
     try: 
      return wrapped(*args, **kwargs) 
     except: 
      # log and re-raise 
      request = args[0] if len(args) > 0 and isinstance(args[0], HttpRequest) else None 
      msg = ("\nuser.id/email: {}/{}\nMETA: {}...\nbody: {}" 
        .format(request.user.id, 
          getattr(request.user, 'email','?'), 
          str(request.META)[:80], 
          request.body) 
        if request 
        else "not a HttpRequest") 
      log.exception(msg) 
      raise 
    return wrapper 

@log_exceptions 
def random_view(request): 
    raise ValueError("simulate a crash") 
    if request.user.is_authenticated() and request.user.is_active: 
     return HttpResponse('hi') 
     # generic view code goes here. 
    else: 
     return HttpResponse(status=401) 

とerrors.logは注意

2017-06-27 20:48:09,282: 
user.id/email: 1/[email protected] 
META: {'SESSION_MANAGER': 'local/acb:@/tmp/.ICE-unix/4255,unix/acb:/tmp/.ICE-unix/4255... 
body: b'' 
Traceback (most recent call last): 
    File "/home/rod/pyves/rangetest/rangetest/data/views.py", line 14, in wrapper 
    return wrapped(*args, **kwargs) 
    File "/home/rod/pyves/rangetest/rangetest/data/views.py", line 31, in random_view 
    raise ValueError("simulate a crash") 
ValueError: simulate a crash 

のようなものをキャプチャする必要があり、あなたもおそらく同様にあなたのerrors.logでDjangoのクラッシュログが表示されます。 Djangoのよく書かれていますが、それでもなお複雑なファイルを使用してログを分割することがあります。 logging config

関連する問題