web-dev-qa-db-ja.com

ロガーのハンドラが見つかりませんでした

私はpythonが初めてです。私はpythonでログインしようとしていたと私は遭遇したロガーインスタンスを介していくつかの警告を印刷しようとしたときにロガーエラーのハンドラが見つかりませんでした。以下は私が試したコードです

import logging
logger=logging.getLogger('logger')
logger.warning('The system may break down')

そして私はこのエラーが出ますロガー "logger"のハンドラが見つかりませんでした

私が最初にloggingを使用して、次にloggerを使用して警告を表示しようとしたとき、私を混乱させているのは、次のようにうまく動作することです。

>>> import logging
>>> logging.warning('This is a WARNING!!!!')
WARNING:root:This is a WARNING!!!!
>>> 
>>> logger.warning('WARNING!!!!')
WARNING:logger:WARNING!!!!

誰かが2番目のシナリオで起こっていることにいくつかの光を投げることはできますか?

52
qwerty

loggerを介してメッセージを記録するには、Pythonではloggerオブジェクトに少なくとも1つのハンドラを追加する必要があります。デフォルトでは、debugwarn、およびloggingモジュール内の他の関数はbasicConfigを呼び出し、これによってStreamHandlerroot loggerに追加されます。

それはあなたのモジュールのために書いているあなたのロガーオブジェクトにあなたの必要なHandlerを追加するために常に 推奨 です。

公式のPythonドキュメント を参照することもできます。これには 素晴らしいチュートリアル があります。あるいは、自分でロギングモジュールのソースコードをチェックすることもできます。

以下のようにして、Pythonシェル自体の中でソースをチェックすることができます。

import logging
import inspect
print(inspect.getsource(logging))

最後に、basicConfigを明示的に呼び出すことで問題は解決します。

import logging
logging.basicConfig()
logger = logging.getLogger('logger')
logger.warning('The system may break down')
15
praba230890

logging.basicConfig()を呼び出します。

>>> import logging
>>> logging.basicConfig()
>>> logger = logging.getLogger('logger')
>>> logger.warning('The system may break down')
WARNING:logger:The system may break down
66
phd

Phdの答えに加えて、logging.basicConfig()を呼び出すことはあなたにデフォルトのStreamHandlerFormatterを与える便利な関数です。ロギング機能をすぐに使いたい場合はそれで十分です。 basicConfigにいくつかの引数を渡すことで、その振る舞いをカスタマイズできます。

便利なパラメータを追加:メッセージとともにタイムスタンプを出力する

logger = logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

これは、必要のないもののほとんどで問題ないはずです。あなたがあなたの設定についてより多くの制御を必要とするならば、あなたはあなた自身をロガーの属性を定義することによってより洗練されたふるまいを追加することができます。

洗練された例basicConfig関数を使わない

import logging
logger = logging.getLogger("mylogger")
streamHandler = logging.StreamHandler()
streamHandler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
streamHandler.setFormatter(formatter)

logger.addHandler(streamHandler)

logger.info("Files copied")
logger.warning("disk quota exceeded")
>> 2017-12-06 11:11:12, 090 - mylogger - INFO Files copied
>> 2017-12-06 11:11:12, 091 - mylogger - WARNING disk quota exceeded

より大きな環境での次のステップは、最初にフォーマットを維持し、さらに「ログ階層」を維持するために、以前に作成されたものから新しいロガーを派生させることです。

logger2 = logging.getLogger("mylogger.new")
logger2.info("New Logger info")
>> 2017-12-06 11:11:12, 091 - mylogger.new - New logger info

良い参考文献はロギングクックブックです。https://docs.python.org/2/howto/logging-cookbook.html

11
user1767754

sentryNo handlers could be found for logger "sentry.errors")を使用しているときにこのエラーが発生した場合は、SNIサポートのためのsentryバグが原因である可能性があります。

詳しくは https://github.com/getsentry/raven- python /issues/52 をご覧ください。簡単な回避策は、DSNスキームをthreaded+requests+httpsに置き換えることです。

RAVEN_CONFIG = {
    'dsn': 'threaded+requests+https://[email protected]/1',
}
0
Ali