web-dev-qa-db-ja.com

Django Herokuにログオンする

この質問はすでに何度か行われていることは知っていますが、うまく機能させることができません。私はすでに半日を数十の組み合わせを試しましたが、今もまた機能していません。

私のコードでは、try-except内や、管理コマンドからの情報をログに記録するなど、いくつかの部分でログを記録しています。私はごく普通のことをやっています。それはいくつかのローカルインストールといくつかのNginxサーバーで働いています。

pythonこのようなファイル:

import logging
logger = logging.getLogger(__name__)
logger.info('some important infos')

最小限のsettings.pyとして以下を使用します(ストリーム表示なし、ロガー指定なし、名前付きロガー、ほぼすべての可能な組み合わせ、さらに複雑な組み合わせを試しました)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'stream': sys.stdout
        }
    },
    'loggers': {
        'Django': {
            'handlers': ['console'],
            'propagate': True,
            'level': 'INFO',
        },
        '': {
            'handlers': ['console'],
            'level': 'INFO',
        }
    }
}

次に、シェルから簡単にテストしますheroku run python

import logging
level = logging.INFO
handler = logging.StreamHandler()
handler.setLevel(level)
handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
logger = logging.getLogger('info')
logger.addHandler(handler)
logger.setLevel(level) #even if not required...
logger.info('logging test')

最後のものはコンソールに「print」ステートメントとして表示される場合がありますが、ここでもコマンドまたはサーバーからでも、heroku logs...に何も表示されません。

編集:実際には、いくつかのエントリが表示されています。アプリケーションログは次のようになっていますが、私のものではありません。

2013-09-20T15:00:16.405492+00:00 heroku[run.2036]: Process exited with status 0
2013-09-20T15:00:17+00:00 app[heroku-postgres]: source=HEROKU_POSTGRESQL_OLIVE sample[...]
2013-09-20T14:59:47.403049+00:00 heroku[router]: at=info method=GET path=/
2013-09-20T14:59:16.304397+00:00 heroku[web.1]: source=web.1 dyno=heroku [...]

また、いくつかのアドオンを使用してエントリを検索しようとしました。私は最初にnewrelicをしばらく持っていましたが、その後WSGIの起動から非アクティブ化しました。当時それがうまくいったかどうかは覚えていませんが、newrelicの無料テスト期間はかなり短いです。

さて、私は他に何を試すことができるかわかりません...ヒントをありがとう

25
Rmatt

DjangoからHerokuにログオンするのは最初は難しいかもしれませんが、実際にはセットアップするのはそれほどひどいことではありません。

この次のロギング定義(設定ファイルに入る)は、2つのフォーマッターを定義しました。冗長なものは、Heroku自体が使用するロギング形式と一致します。また、nullハンドラー(使用する必要はありません)とコンソールハンドラーの2つのハンドラーも定義します。コンソールハンドラーは、Herokuで使用するものです。これは、Herokuへのログオンが単純なストリームロガーによって機能し、stdout/stderrに対して行われたすべての出力をログに記録するためです。最後に、testloggerと呼ばれる1つのロガーを定義しました。ロギング定義のこの部分は、ロギング定義の通常のようになります。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': ('%(asctime)s [%(process)d] [%(levelname)s] ' +
                       'pathname=%(pathname)s lineno=%(lineno)s ' +
                       'funcname=%(funcName)s %(message)s'),
            'datefmt': '%Y-%m-%d %H:%M:%S'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        }
    },
    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class': 'logging.NullHandler',
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        'testlogger': {
            'handlers': ['console'],
            'level': 'INFO',
        }
    }
}

次は、これの使い方です。この単純なケースでは、Djangoプロジェクト内の他のファイルで次のことを実行して、定義したこの特定のロガー(testlogger)に書き込むことができます。ロガーによって覚えておいてください。設定ファイルの定義では、INFO以上のログメッセージが出力されます。

import logging
logger = logging.getLogger('testlogger')
logger.info('This is a simple log message')
29
Tingyou

私の場合、有効なログ設定がありました

LOGGING = {...}

残念ながら、設定ファイルの下部で電話をかけていたため、無視されていました。

Django_heroku.settings(locals())

これは私のロギング設定を上書きしていたので、解決策は

Django_heroku.settings(locals(), logging=False)

これはロギングを無効にする可能性があるように見えますが、実際にはheroku自身のロギング設定をスキップするだけです。


ちなみに、このコードは、Djangoデフォルトで動作するはずなので、Djangoロギングの問題をデバッグするときに使用します。

import logging
logger = logging.getLogger('Django.server')
logger.error('some important infos')

Djangoのデフォルトのロギング設定 を参照してください

次に、ロガー、メッセージレベル、およびログ設定を変更して、問題が何であるかを正確に把握できます。

4
FiddleStix

ロガーを手動で「アクティブ化」する必要があります。 'blog.views'のように、モジュールごとにこれを行うことができます。サブモジュールを取得するため、ブログアプリ全体をログに記録するには、「blog」に入力するだけです。

空のままにすると、以前に処理されなかったものすべてが、propagate = True(デフォルトではない)でログに記録されます。これにより、すべてのDjangoもログに記録されます。つまり、デバッグレベルでは、ログにSQLクエリが記録されます。

'loggers': {
        'Django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'blog.views': {
            'handlers': ['console'],
        },
        'blog': {
            'handlers': ['console'],
        },
        '': {
            'handlers': ['console'],
            'level': 'DEBUG',  # Not recommended.
        }
    }
2
Maikel Wever

カスタムロガーがDjangoに捕らえられなかったので、ERRORレベルのメッセージのみが表示され、Djangoロギングシステム。フォーマッタなどは出力されたメッセージに影響を与えず、INFOレベルのメッセージをまったく表示できませんでした。

ついに原因を見つけました。これはherokuのDjango設定ツール自体のようです。そこでソースを調べると、testloggerがインストールされており、自分でセットアップしたカスタムロガー。

解決策は、次のようにheroku呼び出しを行うことです。

Django_heroku.settings(locals(), logging=False)

または、このパッケージはとにかく維持されなくなったので、もう使用しないでください。

0
Alper