在我的代碼中,我有以下詳細模式和非詳細模式。我正在從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獲得,我不想打印到我的文件將被打印。我能繞過這個嗎?