2016-12-22 9 views
2

私は、プロジェクトが成長するにつれて簡単にコードをデバッグできるようにしようとしています。私は印刷やデバッグの文を追加したり削除したりするのが嫌いです。なぜなら、問題は出力が読みにくくなってしまうからです。私は別のファイルとレベルでロギングを設定できるようにしようとしていますので、logging.conf設定ファイルでオンまたはオフにすることができます。代わりにPythonのlogging.confにログレベルを設定する

One: 2016-12-22 16:36:32,414 - one - DEBUG - debug on one 
One: 2016-12-22 16:36:32,414 - one - INFO - info on one 
One: 2016-12-22 16:36:32,415 - one - WARNING - warn on one 
One: 2016-12-22 16:36:32,417 - one - ERROR - error on one 
One: 2016-12-22 16:36:32,417 - one - CRITICAL - critical on one 
Two: 2016-12-22 16:36:32,421 - two - CRITICAL - critical on two 

私はこれを得た:私はこの出力を期待しているだろう

[loggers] 
keys=root,oneLogger, twoLogger 

[handlers] 
keys=rootHandler, oneHandler, twoHandler 

[formatters] 
keys=rootFormatter,oneFormatter, twoFormatter 

[logger_root] 
level=DEBUG 
handlers=rootHandler 

[logger_oneLogger] 
level=DEBUG 
handlers=oneHandler 
qualname=main 
propagate=1 

[logger_twoLogger] 
level=CRITICAL 
handlers=twoHandler 
qualname=main 
propagate=1 

[handler_rootHandler] 
class=StreamHandler 
formatter=rootFormatter 
args=(sys.stdout,) 

[handler_oneHandler] 
class=StreamHandler 
formatter=oneFormatter 
args=(sys.stdout,) 

[handler_twoHandler] 
class=StreamHandler 
formatter=twoFormatter 
args=(sys.stdout,) 

[formatter_rootFormatter] 
format=Root: %(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt= 

[formatter_oneFormatter] 
format=One: %(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt= 

[formatter_twoFormatter] 
format=Two: %(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt= 

:ここ

import logging.config 
logging.config.fileConfig('logging.conf') 
if __name__ == "__main__": 
    one = logging.getLogger("oneLogger") 
    two = logging.getLogger("twoLogger") 
    one.debug("debug on one") 
    one.info("info on one") 
    one.warn("warn on one") 
    one.error("error on one") 
    one.critical("critical on one") 
    two.debug("debug on two") 
    two.info("info on two") 
    two.warn("warn on two") 
    two.error("error on two") 
    two.critical("critical on two") 

は私logging.confファイルである:ここで

は私のコードです:

Root: 2016-12-22 16:36:32,414 - one - DEBUG - debug on one 
Root: 2016-12-22 16:36:32,414 - one - INFO - info on one 
Root: 2016-12-22 16:36:32,415 - one - WARNING - warn on one 
Root: 2016-12-22 16:36:32,417 - one - ERROR - error on one 
Root: 2016-12-22 16:36:32,417 - one - CRITICAL - critical on one 
Root: 2016-12-22 16:36:32,418 - two - DEBUG - debug on two 
Root: 2016-12-22 16:36:32,418 - two - INFO - info on two 
Root: 2016-12-22 16:36:32,420 - two - WARNING - warn on two 
Root: 2016-12-22 16:36:32,421 - two - ERROR - error on two 
Root: 2016-12-22 16:36:32,421 - two - CRITICAL - critical on two 

私は、ロガー2がクリティカルログのみに制限され、ロガー1はすべてのログを受け入れることを期待していました。代わりに、ルートロガーがすべてのログを処理したことに驚きました。

私は何をしているのか間違っていると思いますか?

答えて

2

「qualnameは、」私は、ロガー自体の名前を探してとNOTたものであるようだ。ここでは

は私のコードです:

ここ
import logging.config 
logging.config.fileConfig('logging.conf') 
if __name__ == "__main__": 
    one = logging.getLogger("one.oneLogger") 
    one.debug("debug on one") 
    one.info("info on one") 
    one.warn("warn on one") 
    one.error("error on one") 
    one.critical("critical on one") 
    two = logging.getLogger("two") 
    two.debug("debug on two") 
    two.info("info on two") 
    two.warn("warn on two") 
    two.error("error on two") 
    two.critical("critical on two") 
    root = logging.getLogger() 
    root.debug("debug on root") 
    root.info("info on root") 
    root.warn("warn on root") 
    root.error("error on root") 
    root.critical("critical on root") 

は私のlogging.confファイルです:

[loggers] 
keys:root,twoLogger,oneLogger 

[handlers] 
keys:rootHandler,oneHandler,twoHandler 

[formatters] 
keys:rootFormatter,oneFormatter,twoFormatter 

[logger_root] 
level:DEBUG 
handlers:rootHandler 

[logger_oneLogger] 
level:WARN 
handlers:oneHandler 
qualname:one 
propagate:0 

[logger_twoLogger] 
level:CRITICAL 
handlers:twoHandler 
qualname:two 
propagate:0 

[handler_rootHandler] 
class:StreamHandler 
formatter:rootFormatter 
args:(sys.stdout,) 

[handler_oneHandler] 
class:StreamHandler 
formatter:oneFormatter 
args:(sys.stdout,) 

[handler_twoHandler] 
class:StreamHandler 
formatter:twoFormatter 
args:(sys.stdout,) 

[formatter_rootFormatter] 
format:Root: %(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt: 

[formatter_oneFormatter] 
format:One: %(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt: 

[formatter_twoFormatter] 
format:Two: %(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt: 
ここ

は私の出力です:

One: 2016-12-24 12:46:14,244 - one.oneLogger - WARNING - warn on one 
One: 2016-12-24 12:46:14,246 - one.oneLogger - ERROR - error on one 
One: 2016-12-24 12:46:14,246 - one.oneLogger - CRITICAL - critical on one 
Two: 2016-12-24 12:46:14,247 - two.twoLogger - CRITICAL - critical on two 
Root: 2016-12-24 12:46:14,249 - root - DEBUG - debug on root 
Root: 2016-12-24 12:46:14,249 - root - INFO - info on root 
Root: 2016-12-24 12:46:14,250 - root - WARNING - warn on root 
Root: 2016-12-24 12:46:14,250 - root - ERROR - error on root 
Root: 2016-12-24 12:46:14,252 - root - CRITICAL - critical on root 
+0

'logging.getLogger( "one.oneLogger")'と 'logging.getLogger( "2" を呼び出すの違いは何) '? – cphlewis

+0

logging.confファイルには、警告メッセージ以上を記録する "oneHandler"(qualnameは "one")の設定と、重要なメッセージのみを記録する "twoLogger"(qualnameは "two")設定があります。 confファイル内のロガーの名前が使用されます。 "one.oneLogger"という名前のconfファイルに別のロガーを追加する場合、ロギングサブシステムは "one"の前にそれを照合し、そのレベル(およびハンドラ)を使用します。 – jordanthompson

関連する問題