在我的代码中,我有以下内容用于详细模式和非详细模式。我是从logDict对象中读取的。
我希望在详细模式下,我会将"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?)< - 我也在看这个,但我的问题被翻转了。在dict配置中,我的设置比我实际想要打印的设置更严格,这意味着如果我重置记录器的日志级别,我将从dictConfig获取,我不想打印到我的文件的是打印。我可以绕过这个吗?
答案 0 :(得分: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")
我认为这样做意味着文件处理程序级别也会发生变化,但出于某些原因并没有发生。如果有人知道为什么我想知道内部是如何工作的。