2016-12-22 68 views
2

我想讓我的項目變得更容易調試我的代碼。我討厭添加和刪除打印或調試語句(爲什麼不把它們留在?)問題是輸出變得混亂閱讀。我試圖能夠設置不同文件和級別的日誌記錄,所以我可以通過logging.conf配置文件打開或關閉它。在Python的logging.conf中設置日誌記錄級別

這裏是我的代碼:

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文件:

[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= 

我本來期望的輸出:

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 

相反,我得到這個:

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 

我在期待那個記錄器將被限制爲只有CRITICAL日誌,並且記錄器可以接受所有的日誌。相反,我很驚訝地看到根記錄器處理了所有的日誌。

我在做什麼/假設錯誤?

回答

2

明白了。看來,「qualname」就是我一直在尋找,而不是記錄儀本身的名稱:

這裏是我的代碼:

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( 「兩化」 之間的區別)'? – cphlewis

+0

在logging.conf文件中,我有「oneHandler」(qualname是「one」)設置來記錄警告消息和上面的和「twoLogger」(qualname是「2」)設置爲只記錄關鍵消息任何記錄器匹配根將使用conf文件中的記錄器名稱。如果我要在配置文件中添加另一個具有「one.oneLogger」質量名稱的記錄器,則日誌記錄子系統將在「one」之前匹配它並使用其級別(和處理程序) – jordanthompson

相關問題