我正在使用以下dictConfig作为记录器。但是,我无法在运行时修改日志记录级别。
log_config.json的#contents
{
"version": 1,
"disable_existing_loggers": false,
"formatters": {
"simple": {
"format": "%(asctime)s - %(name)-12s - %(levelname)-8s - %(message)s",
"datefmt": "%Y-%m-%d %H:%M:%S"
},
"detailed": {
"format": "%(asctime)s %(name)-12s %(module)-17s line:%(lineno)-4d %(levelname)-8s %(message)s",
"datefmt": "%Y-%m-%d %H:%M:%S"
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "INFO",
"formatter": "simple",
"stream": "ext://sys.stdout"
},
"info_file_handler": {
"class": "logging.handlers.TimedRotatingFileHandler",
"level": "INFO",
"formatter": "detailed",
"filename": "info.log",
"when": "midnight",
"backupCount": 7,
"encoding": "utf8"
},
"error_file_handler": {
"class": "logging.handlers.TimedRotatingFileHandler",
"level": "ERROR",
"formatter": "detailed",
"filename": "errors.log",
"when": "midnight",
"backupCount": 7,
"encoding": "utf8"
}
},
"loggers": {
"": {
"level": "ERROR",
"handlers": ["console"],
"propagate": "no"
}
},
"root": {
"level": "NOTSET",
"handlers": ["console", "info_file_handler", "error_file_handler"]
}
}
然后我获取记录器并使用以下方式设置级别:
with open('/path/to/log_config.json', 'r') as fd:
cfg = json.load(fd)
logging.config.dictConfig(cfg)
logger = logging.getLogger(__name__)
logger.setLevel(10)
但是,因为记录器是使用dictConfig创建的,所以我无法覆盖级别。我想构建一个UI工具,它有一个选项菜单,可以在运行时调整日志记录级别,而无需破解开放代码或json文件进行调整。我能够将水平调高,但由于某种原因,它不会让水平降低......
我想要做的是在配置中将info_file和控制台处理程序设置为INFO(20),然后可以选择在运行时将它们更改为DEBUG(10)。有什么想法吗?
答案 0 :(得分:0)
我遇到了类似的问题,只是想出来了。
在我的情况下,我只想改变"控制台"的等级。处理程序,但您可以轻松地将其扩展到所有处理程序并尝试它:
logger = logging.getLogger(__name__)
for handler in logger.handlers:
if handler.get_name() == 'console':
handler.setLevel(logging.DEBUG)
(请注意,我复制了您的__name__
,但对我来说,我使用实际的字符串来命名记录器 - 以防万一重要)
答案 1 :(得分:0)
我一直在寻找字典配置,但发现了您的问题。我遵循了您的确切代码,并且也无法更改日志级别,所以我发现了this answer。使用@Tjorriemorrie的第三个解决方案而不是__name__
返回了正确的logger.handlers
。然后我与@Starman的answer结合在一起...现在,我可以随时随地更改日志记录级别。
logger = logging.getLogger()
for handler in logger.handlers:
if handler.get_name() == 'console':
handler.setLevel(logging.DEBUG)
PS:感谢您的代码段!这对我很有帮助。