2012-01-18 9 views
0

Djangoのロギングに問題があります。ところで、この質問への回答はDjangoの名前空間の仕組みを明確にするのに役立ちます。私は1つのファイルにすべてのメッセージをログに記録したいとDjangoのロギングプロジェクトとアプリのネームスペース

MyProject: 
    -App1: 
     .... 
     views.py 
    -App2: 
     .... 
    urls.py 
    settings.py 

:ここ

は私のプロジェクトの構造です。ブラウザで

from django.views.generic import DetailView 
import logging 
logger = logging.getLogger(__name__) 

.... 

class EvenementDetailView(DetailView): 
    print __name__ 
    model=Evenement 
    .... 
    logger.debug('blabla') 

:urls.pyで

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': True, 
    'formatters': { 
      'verbose': { 
        #'format': '%(levelname)-8s %(remote_addr)-15s %(path_info)s %(asctime)s %(name)-20s %(funcName)-15s %(message)s' 
        'format': '%(levelname)-8s %(asctime)s %(name)-20s %(funcName)-15s %(message)s' 
        }, 
      }, 
    'handlers': { 
      'normal': { 
      'level': 'DEBUG', 
      'class': 'logging.FileHandler', 
      'formatter': 'verbose', 
      'filename': os.path.join('C:/dev/Instantaneus/Instantaneus/html/static', 'log', 'normal.log') 
     }, 
      'console': { 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
      'formatter': 'verbose', 
      }, 
     }, 
    'loggers': { 
     'MyProject': { 
       'handlers': ['normal','console'], 
       'level': 'DEBUG', 
       #'filters': ['request'], 
       'propagate': True, 
       }, 
      } 
     } 

from MyProject.App1.views import EvenementDetailView, 
.... 
url(r'App1/(?P<pk>\d+)/$', login_required(EvenementDetailView.as_view(model=Evenement)), name='evenement_details'), 

とのApp1/views.pyでそれから私はsettings.py次ロガーでセットアップをしましたhttp://localhost/App1/3と呼ぶと、コンソールに次のようなメッセージが表示されます。

DEBUG 2012-01-18 14:59:04,503 Myproject.evenements.views EvenementDetailView blabla 
MyProject.evenements.views 
evenements.views 

私の質問はなぜprint __name__のコードが2回実行され、出力が同じでないのが最も重要なのですか?

私は、この場合には根がevenements

任意のアイデアですのでevenement.viewsがMyProjectのに伝播することはできませんのでDEBUGログは一度だけ表示されていることを想定?

ソリューションではなく、深さの説明ではなく、それが動作して:私のurls.pyで

、私は「アクティブ」はApp1の/ views.py内の関数であるラインurl(r'App1/(?P<pk>\d+)/activate/$', 'app1.views.activate')を持っていました。私は'MyProject.app1.views.activate''App1.views.activate'を変更しても問題ありません。私はprint __name__のコンソールに1行しかありません。私は 'disable_existing_loggers'のために私は1行しかないと思います。本当ですが、私が説明できないことは、このソリューションが私のviews.pyを2回前に1回だけ解析することでした。そのことを確認するために、ファイルの先頭にprint "blabla"を追加しました。最初のケースでは彼は2回、2回目ではoncesだけを印刷しています。

答えて

1

公正な警告:私はこれが正しいとは確信していません。私はずっと前に読んでいたことを覚えていますが、今はGoogleで見つけることができません。

あなたが見ているのは、Pythonのインポートメカニズムがどのように機能するかの副作用です。モジュールをインポートするとsys.modulesになりますが、2つの異なる点線のパス(この場合はMyProjectの有無にかかわらず)でモジュールをインポートすることができるときは、それぞれ__name__の下に2回インポートすることができます。

根本的な修正がsys.pathでないことMyProjectを確認することです - それ自身MyProjectを含むディレクトリはあるべきではなく、MyProjectmanage.py shellを開始し、import evenementsが失敗することを確認して、これが実行されたことを確認できます。 manage.pyには、これを難しくする可能性のあるDjangoの内部構造がいくつかありますが、最後に私がこの問題に遭遇したのは1.0または1.1前後だったので、修正されている可能性があります。

の深い議論がここにあります:

http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

それは長い記事、「2人の異なる名前」を検索します。

+0

こんにちはアダム。お返事ありがとうございました。あなたが示唆するように、私はPythonのパスから親のdirectoyを削除しました。彼はもうsys.pathにはいないが、結果は同じだ。長い記事については、後で詳しく見ていくつもりですが、私のレベルでは少し複雑です! – Youpsla

+0

類似の問題:http://stackoverflow.com/a/8917273/16361 – AdamKG

関連する問題