web-dev-qa-db-ja.com

Django=コンソールへのロギング

コンソールにログを記録するロガーを設定しようとしています(HerokuをPapertrails(Herokuのロギングアドオン)で使用しているため、コンソールに書き込まれたものがPapertrailsに表示され、フィルター可能になります。素敵なPapertrail機能。)

設定では、最初に次のことを試していました:

LOGGING = {
    'handlers' = {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': 'mysite.log',
            'formatter': 'verbose'
        },
        'console':{
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
    },
    (...)
    'loggers'={
        (...)
        'page_processors': {
            'handlers': ['console','file'],
            'level': 'DEBUG',
        }
    }
    (...)
}

djangoのログページ(Mezzanineを使用しない場合、page_processorsはページを開くたびにMezzanineが実行するものです。Djangoのビューのように考えることができますが、レンダリングではなくコンテキストのみを行います)。

Page_processors.pyには私が持っています

import logging
logger = logging.getLogger(__name__)

@process_for(MyPage):
def myfunc(request, Page):
    logger.info('page_processor logging test')
    print 'my page_processor print'
    (...)

ページを更新すると、ロガーは表示されませんが、印刷とファイルへのログが表示されます。

[02/Mar/2014 23:07:10] INFO [myApp.page_processors:13] page_progessor logging test

そして、私はロジックが機能していることを知っています。少しグーグルで調べたところ、 thisthis page がこの問題に正確に対処していることがわかりました。彼は、デフォルトでlogging.StreamHandlerがSTDERRにログを記録すると言います。 STDOUTにログを記録する場合、キーワード引数 'stream'をlogging.StreamHandlerコンストラクトに追加し、ハンドラーを次のように構成する必要があります。

'handlers':{
    (...)
    'console':{
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'stream': sys.stdout
    },
}

これはまだ機能せず、エラーも何も表示されず、印刷とファイルログが表示されます。コンソールロガーではありません。

どうしたの?

編集: this を試しましたが、違いはありません。

24
oneloop

やっと手に入れました。ここで何が起こっていました。

GetLoggerを使用してロガーを定義するとき、ロガーに名前を付けます。この場合

logger = logging.getLogger(__name__)

そして、その名前のロガーがLOGGING構成でどのように動作するかを定義する必要があります。この場合、そのファイルはモジュール内にあるため、ロガーの名前はpage_processorsではなくmyApp.page_processorsになるため、LOGGING dictの「page_processors」という名前のロガーは呼び出されません。では、なぜファイルへのロギングは機能していましたか?コードで示す(...)には、明らかに代わりに呼び出される「myApp」という名前の別のロガーがあり、そのロガーがファイルに書き込むためです。

したがって、この質問に対する解決策は、ロガーに適切な名前を付けることです。

LOGGING = {
    # (...)
    'loggers': {
        # (...)
        'myApp.page_processors': {
            'handlers': ['console','file'],
            'level': 'DEBUG',
        }
    }
    # (...)
}
29
oneloop

次のスクリプト:

import logging, logging.config
import sys

LOGGING = {
    'version': 1,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'stream': sys.stdout,
        }
    },
    'root': {
        'handlers': ['console'],
        'level': 'INFO'
    }
}

logging.config.dictConfig(LOGGING)
logging.info('Hello')

出力をファイルにパイプすることで確認できるように、Hellosys.stdoutに書き込みます。そのため、あなたの問題はどこか別の場所にある可能性が高いです(または、sys.stdoutが期待したものではない可能性があります)。 sys.__stdout__を試して、違いが生じるかどうかを確認できます。

19
Vinay Sajip

私は私のようなダミーを簡単に理解するためにこれを書いています。

Settings.pyで

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'app_api': {
            'handlers': ['console'],
            'level': 'INFO',
        },
    },
    }

アプリケーションビューのどこか

import logging
logger = logging.getLogger('app_api') #from LOGGING.loggers in settings.py

try:
    one = 1/0
except Exception as e:
    logger.error(e)
0
rogoro