29

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

私のコードでは、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 の無料テスト期間はかなり短くなっています。

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

4

4 に答える 4

37

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')
于 2014-01-07T22:44:12.713 に答える