2017-07-27 75 views
0

在我的代碼中,我有以下詳細模式和非詳細模式。我正在從logDict對象讀取數據。使用dictConfig進行日誌記錄並寫入控制檯和文件

我預計,在詳細模式我會得到"DEBUG MODE: test debug""DEBUG MODE: test error"寫入控制檯和"[uuid] [date] [etc] test error"只寫入一個文件,並在非詳細模式,沒有什麼被打印到控制檯,但"test error"將被寫入到文件。

首先,這裏是我的dictConfig

LOGGING_DICT = { 
'version': 1, 
'disable_existing_loggers': False, 
'formatters': { 
    'simple': { 
     # we have a uuid for the log so we know what process it came from 
     'format': '[{0}][%(asctime)s][%(name)s][%(levelname)s] : %(message)s'.format(logger_id), 
     'datefmt': "%Y-%m-%d %H:%M:%S", 
     } 
}, 
'loggers': { 
    'root': { 
     'handlers': ['console'], 
     'level': 'DEBUG', 
    }, 
    'script_A': { 
     'handlers': ['timed_rotate_file'], 
     'level': 'INFO', 
    }, 
}, 
'handlers' : { 
    'timed_rotate_file': { 
     'filename': 'logs/weekly_tool.log', 
     'level': 'INFO', 
     'formatter': 'simple', 
     'class': 'logging.handlers.TimedRotatingFileHandler', 
     'encoding': 'utf8', 
     # Used to configure when backups happen 'seconds, minutes, w0,w1 (monday tuesday) 
     'when': 'midnight', # Daily backup 
     # This is used to configure rollover (7=weekly files if when = daily or midnight) 
     'backupCount': 7, 
    } 
} 

而現在,調用它

from logging.config import dictConfig 
from helpers.logging_config import LOGGING_DICT 

... 
main(): 
    logger.debug("test debug") 
    logger.error("test error") 

if __name__ == "__main__": 
    if args.verbose: 
     dictConfig(LOGGING_DICT) 
     logger = logging.getLogger("script_A") 
     stream_handler = logging.StreamHandler() 
     formatter = logging.Formatter("DEBUG MODE: %(message)s") 
     stream_handler.setFormatter(formatter) 
     stream_handler.setLevel(logging.DEBUG) 
     logger.addHandler(stream_handler) 
    else: 
     dictConfig(LOGGING_DICT) 
     logger = logging.getLogger("script_A") 

劇本我得到的卻是以下幾點:

~$ python script_A.py 
~$ (No output, as expected) 
~$ python script_A.py -v 
~$ DEBUG MODE: test error 

爲什麼test_debug不打印到控制檯?顯然流處理程序正在被調用,但是該級別要麼沒有被正確設置,要麼被忽略。

當我在腳本中間打印logger.level時,我得到了20,這是我期望得到的dictConfig,但是處理程序的級別是單獨設置的,這是否意味着它被忽略? (What is the point of setLevel in a python logging handler?)< - 我也在看這個,但我的問題翻轉了。在字典配置我的設置比我真正想要打印更嚴格,這意味着如果我重置日誌級別爲記錄器,我從dictConfig獲得,我不想打印到我的文件將被打印。我能繞過這個嗎?

回答

1

我自己想通了。與我發佈的內容類似,我必須重置日誌級別。

if __name__ == "__main__": 
    if args.verbose: 
     dictConfig(LOGGING_DICT) 
     logger = logging.getLogger("script_A") 
     stream_handler = logging.StreamHandler() 
     formatter = logging.Formatter("DEBUG MODE: %(message)s") 
     stream_handler.setFormatter(formatter) 
     stream_handler.setLevel(logging.DEBUG) 
     logger.addHandler(stream_handler) 
     logger.setLevel(logging.DEBUG) 
    else: 
     dictConfig(LOGGING_DICT) 
     logger = logging.getLogger("script_A") 

我認爲這樣做意味着文件處理程序級別也會發生變化,但由於某種原因,這種情況不會發生。如果有人知道我爲什麼想知道內部工作如何解決這個問題。

相關問題