コンソールにログを記録するロガーを設定しようとしています(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
そして、私はロジックが機能していることを知っています。少しグーグルで調べたところ、 this と this page がこの問題に正確に対処していることがわかりました。彼は、デフォルトでlogging.StreamHandlerがSTDERRにログを記録すると言います。 STDOUTにログを記録する場合、キーワード引数 'stream'をlogging.StreamHandlerコンストラクトに追加し、ハンドラーを次のように構成する必要があります。
'handlers':{
(...)
'console':{
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'stream': sys.stdout
},
}
これはまだ機能せず、エラーも何も表示されず、印刷とファイルログが表示されます。コンソールロガーではありません。
どうしたの?
編集: this を試しましたが、違いはありません。
やっと手に入れました。ここで何が起こっていました。
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',
}
}
# (...)
}
次のスクリプト:
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')
出力をファイルにパイプすることで確認できるように、Hello
をsys.stdout
に書き込みます。そのため、あなたの問題はどこか別の場所にある可能性が高いです(または、sys.stdoutが期待したものではない可能性があります)。 sys.__stdout__
を試して、違いが生じるかどうかを確認できます。
私は私のようなダミーを簡単に理解するためにこれを書いています。
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)