博覧会:なぜPythonのログパッケージはいくつかのレベルを無視しますか?
3.6.3 Pythonでロギングモジュールを使用して、いくつかの誤解の問題があります。 最初は、名前とレベル= 30のない標準設定で2つのログを作成します。これはlogging.WARNINGです。
ログオブジェクトはハンドラなしで処理されますので、ログレベルを10(logging.DEBUG)に変更し、INFO(レベル= 20)を使用してログを出力するときは、レベル10にある(情報レベルの下)の情報がログと、最終的には、ログには、任意のハンドラを持っていないしませんが、https://docs.python.org/3/library/logging.html?highlight=logging#module-loggingのドキュメントは言う:
logging.basicConfig(** kwargsから)¶ :
はデフォルトのフォーマッタで StreamHandlerのを作成し、ルート ロガーに追加し、ログ記録システムの基本的な設定を行います。 ハンドラがルートロガーに定義されていない場合、関数debug()、info()、warning()、error()および critical()は、basicConfig()を自動的に呼び出します。
私の質問は、私が間違っていることですか?なぜこれが起こったのですか? Log.setLevel(logging.INFO)としてルートのレベルを設定し、この問題までやっていたようにlog.info( "poo")を作成することはできませんか?
コード:
Python 3.6.3 (default, Oct 31 2017, 11:19:55)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import logging
In [2]: log1 = logging.getLogger()
In [3]: log2 = logging.getLogger()
In [4]: log1.level
Out[4]: 30
In [5]: log1.hasHandlers()
Out[5]: False
In [6]: log1.setLevel(10) ## logging.DEBUG == 10
In [7]: log1
Out[7]: <RootLogger root (DEBUG)>
In [8]: log2
Out[8]: <RootLogger root (DEBUG)>
In [9]: log1.info("asdad")
In [10]: log2.info("asdad")
In [11]: log1.hasHandlers()
Out[11]: False
In [12]: logging.basicConfig(level=20) # logging.INFO == 20
In [13]: log2
Out[13]: <RootLogger root (INFO)>
In [14]: log2.info("ASDADA")
INFO:root:ASDADA
In [15]: log1.hasHandlers()
Out[15]: True
In [16]: log1.handlers == log2.handlers
Out[16]: True
In [17]: logging.basicConfig(level=10) # logging.DEBUG == 10
In [18]: log2.info("ASDADA")
INFO:root:ASDADA
In [19]: log1
Out[19]: <RootLogger root (INFO)>
In [20]: log2
Out[20]: <RootLogger root (INFO)>
In [21]: log1.level
Out[21]: 20
更新:1 UPDATED
In [1]: import logging
In [2]: logging.getLogger().hasHandlers()
Out[2]: False
In [3]: logging.getLogger().level
Out[3]: 30
In [4]: logging.getLogger().info("papa")
In [5]: logging.getLogger().hasHandlers()
Out[5]: False
In [6]: logging.info("foo")
In [7]: logging.getLogger().hasHandlers()
Out[7]: True
:2
In [2]: import logging
In [3]: log = logging.getLogger()
In [4]: log.info("poo")
In [5]: log.warning("poo")
poo
In [6]: log.setLevel(logging.INFO)
In [7]: log.info("poo")
は、ルートレベルは、のように印刷されますと同じかそれ以上のレベルでlogging.WARNING(30)が何である** UPDATE:1 ** は、しかし、私が求めていたことである ときにI loggingWARNINGより前のbasicConfigがない場合、レベルをLoggerよりも小さく変更してください。setLevelメソッドはLoggerオブジェクトでは機能しません。 ** UPDATE:2 **のように、logging.infoメソッドを呼び出すのは面倒ですが、必要なのは、設定を共有する同じ名前の複数のLoggerですが、Loggerを使用しているときオブジェクト状況はこれです: – PurpleZooL
@PurpleZooL私はあなたのコメントを完全に理解していないのですか?あなたの質問には、多くのコード行があります.pelase状態は、期待通りに動作します。 – VPfB
@PurpleZooLあなたは "私が望むものは同じ名前のロガーの束です"と言う。ロガーはシングルトンなので意味がありません。 'logging.getLogger(name)'を使って複数のロガーを作成することはできません。与えられた名前に関しては、 'getLogger()'から同じ 'Logger'インスタンスを返すことになります。 –