2017-12-21 3 views
0

博覧会:なぜ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") 

答えて

1

を私が引用されたドクメンタを考えます十分に明確ではありません。ドキュメントWebページ上のリストされた機能をクリックすると、logging.info()のような機能にリンクされます。代わりに同じ名前のロガーオブジェクトメソッドを使用していました。デフォルトでは

>>> import logging 
>>> logging.getLogger().hasHandlers() 
False 
>>> logging.warning("TEST") 
WARNING:root:TEST 
>>> logging.getLogger().hasHandlers() 
True 
+0

は、ルートレベルは、のように印刷されますと同じかそれ以上のレベルでlogging.WARNING(30)が何である** UPDATE:1 ** は、しかし、私が求めていたことである ときにI loggingWARNINGより前のbasicConfigがない場合、レベルをLoggerよりも小さく変更してください。setLevelメソッドはLoggerオブジェクトでは機能しません。 ** UPDATE:2 **のように、logging.infoメソッドを呼び出すのは面倒ですが、必要なのは、設定を共有する同じ名前の複数のLoggerですが、Loggerを使用しているときオブジェクト状況はこれです: – PurpleZooL

+0

@PurpleZooL私はあなたのコメントを完全に理解していないのですか?あなたの質問には、多くのコード行があります.pelase状態は、期待通りに動作します。 – VPfB

+0

@PurpleZooLあなたは "私が望むものは同じ名前のロガーの束です"と言う。ロガーはシングルトンなので意味がありません。 'logging.getLogger(name)'を使って複数のロガーを作成することはできません。与えられた名前に関しては、 'getLogger()'から同じ 'Logger'インスタンスを返すことになります。 –

関連する問題