私は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番目のシナリオで起こっていることにいくつかの光を投げることはできますか?
logger
を介してメッセージを記録するには、Pythonではlogger
オブジェクトに少なくとも1つのハンドラを追加する必要があります。デフォルトでは、debug
、warn
、およびlogging
モジュール内の他の関数はbasicConfig
を呼び出し、これによってStreamHandler
がroot 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')
logging.basicConfig()を呼び出します。
>>> import logging
>>> logging.basicConfig()
>>> logger = logging.getLogger('logger')
>>> logger.warning('The system may break down')
WARNING:logger:The system may break down
Phdの答えに加えて、logging.basicConfig()
を呼び出すことはあなたにデフォルトのStreamHandler
とFormatter
を与える便利な関数です。ロギング機能をすぐに使いたい場合はそれで十分です。 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
sentry (No 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',
}