2011-07-19 14 views
21

私はDjangoの初心者です。今はDjangoのログをとろうとしています。しようとしているときに、私は(私のsettings.pyで) ..hereが私のコードである[サンプル「『』いいえハンドラはロガーのために見つかりませんでした」このエラーロガーのハンドラが見つかりませんでした

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'formatters': { 
     'simple': { 
      'format': '%(asctime)s %(levelname)s %(name)s %(message)s' 
     }, 
    }, 
    'handlers': { 
     'default': { 
      'level':'DEBUG', 
      'class':'logging.handlers.RotatingFileHandler', 
      'filename': '/home/linuxuser/mani/f/logs/msg.log', 
      'maxBytes': 1024*1024*5, # 5 MB 
      'backupCount': 5, 
      'formatter':'simple', 
     }, 
    }, 
    'loggers': { 
     'sample': { 
      'handlers': ['default'], 
      'level': 'DEBUG', 
      'propagate': True, 
     }, 
    } 
} 

を(取得しています私のviews.pyで)

import logging 
import logging.handlers 
from django.conf import settings 
logger = logging.getLogger('sample') 

def empdel(request,id): 
    e = get_object_or_404(emp, pk=id) 
    e.delete() 
    logger.info('A row is deleted successfully !!!') 
    return HttpResponseRedirect('/empthanks/') 

このコードを実行している間、私はすなわち、このエラーを得た[「サンプル 『』いいえハンドラはロガーのために見つかりませんでした」] ..いただきました私のコードで間違って?なぜ私はLOGGINGでハンドラを使用していても、このようなエラーが出るのですか?私はログに記録したファイルにログメッセージを保存しようとしています。前もって感謝します !!!

+1

この正確なコードは私の作品です(ファイル名を変更しました)。あなたはDjango 'shell'からロガーを入手できますか?あなたは 'runserver'を再起動しようとしましたか? – sneeu

+0

@ sneeu:ya働いています。以前はdjango 1.2.3を使っていましたので、うまくいきませんでした... django 1.3にアップグレードしたので、今は動作しています...もう1つ疑問?私のコードで使用しているもの)とそのファイルへのいくつかのdafaultのメッセージ..例えば:DEBUG django.db.backends(0.049)いくつかのSQLのクエリ..なぜ起こっていますか? – Mani

+0

Djangoにはいくつかのロガーがありますが、私は[docs](https://docs.djangoproject.com/en/1.3/topics/logging/#django- s-logging-extensions)を使用します。 – sneeu

答えて

22

ドキュメントは少し不明ですが、組み込み機能を使用してロギング設定を指定すると、ロガーのインスタンスを取得する必要はありません。

あなたは、単に次のようにします:

import logging 

def empdel(request,id): 
    e = get_object_or_404(emp, pk=id) 
    e.delete() 
    logging.info('A row is deleted successfully !!!') 
    return HttpResponseRedirect('/empthanks/') 
+9

私はあなたが物事を混ぜていると思います。 'logging'でモジュールレベルの関数を呼び出すことによって、使用されるロガーはルートロガーになります。あなたの例は 'import logging'、' logger = logging.getLogger() '、' logger.info(...) 'に似ています。 – glarrain

12

私はあなたがHandlerloggingパッケージのコンテキストにあるものを誤解していると思います。

ハンドラは、ロガーに添付するオブジェクトです。 ロガーが処理するメッセージを持つたびに、メッセージはすべてのハンドラに送信されます。 さらに、ロガーはツリー構造で存在し、適切な名前の "ルート"ロガーがそのルートにあります。 メッセージをハンドラに送信した後、Loggerはそのメッセージをツリーの親に渡します(Loggerインスタンスのpropagate属性によって決まります)。

ちょっとユーモアのある脇に、誰かがルート・ロガーとは違う「root」という名前のロガーを使い始めたというアプリケーション・バグを発見しました。

ルートロガー(logging.infoと会社、またはlogging.getLogger()でアクセス)を使用しないでください。 変更したハンドラや設定は、エラーをルート・ロガーに伝播させる、適切に動作するライブラリにも影響します。ケース1:私はかつて怠惰からルートログを使って簡単なスクリプトを書いた。 その後、botoにいくつかの呼び出しを組み込み、ルートロガーに伝播されていたデバッグメッセージが爆発的に発生しました。 私は強く徹底を与えることをお勧めしますlogging.getLogger(__name__)

でロガーを作成することで(これも.getLoggerの解釈で素敵な継承構造につながる)あなたは常に名前が名前空間であなたのパッケージの名前と一致するロガーを作成することをお勧めしますloggingのロガーオブジェクトに関するセクションを参照してください。docs:https://docs.python.org/2/library/logging.html

あなたの設定にもFormatterが指定されています。 フォーマッタは、ハンドラによってメッセージが処理されたときにメッセージの表示を処理するので、rsyslogなどの場合とは異なり、単一のメッセージの出力形式が異なる場合があります。


あなたのコードを修正するには、作成したロガーを使用して、ハンドラをアタッチするだけです。 多くの典型的な使用例が含まれているので、StreamHandlerを作成することをお勧めします(基底Handlerクラスはインスタンス化されることを意図していませんが、恐ろしい理由でABCではありません)。

myhandler = logging.StreamHandler() # writes to stderr 
myformatter = logging.Formatter(fmt='%(levelname)s: %(message)s') 
myhandler.setFormatter(myformatter) 
logger.addHandler(myhandler) 

しかし、Djangoの設定にはすでに多くの情報が含まれているように思われます。 実際にDjangoのアプリケーションを書いているわけではありませんが、Djangoはここに悪い情報を与えたくありません:https://docs.djangoproject.com/en/dev/topics/logging/

+0

何が恐ろしい理由? – n611x007

+1

@naxa私は100%の明瞭さを覚えていませんが、私が心に留めていたことを覚えていますが、これはPythonの歴史的なABC嫌悪に嘆かわしいことでしょう。あなたがタイプのものを鴨居できる時には、インスタンス化できないクラスの概念は必要ではないという考え方が長らく残っていました。引数は、基本クラスを定義する必要はなく、そのプロトコルを実装するだけでよいということです。このような姿勢は、2002年に「ロギング」が最初に追加され、ABCが2007年に追加されたために変更されました。 – sirosen

関連する問題