Python 日志覆盖 dictConfig 级别

标签 python json logging config log-level

我正在使用以下 dictConfig 作为记录器。但是,我无法在运行时修改日志记录级别。

#log_config.json 的内容

{
    "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)。有什么想法吗?

最佳答案

我遇到了类似的问题,刚刚弄明白了。

在我的例子中,我只想更改“控制台”处理程序的级别,但您可以轻松地将其扩展到所有处理程序并尝试一下:

logger = logging.getLogger(__name__)
for handler in logger.handlers:
    if handler.get_name() == 'console':
        handler.setLevel(logging.DEBUG)

(请注意,我复制了您的 __name__,但对我而言,我使用的是实际字符串来命名记录器 - 以防万一)

关于Python 日志覆盖 dictConfig 级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44663292/

相关文章:

python - 'as' 运算符是做什么的?

python - 如何避免 `obj.save()`不更新 `updated_at`字段?

python 和json.dump : how to make inner array in one line

hibernate - 如何在 Hibernate 4 中配置日志记录以使用 SLF4J

java - PropertyConfigurator.configure 不适用于 spring

python - 使用 Python 更新列表中的值

python - 从列表中过滤字符串

json - grails,在将域列表呈现为 JSON 时禁用急切获取

json - 将json字符串解析到kdb表的通用函数?

java - Log4j2 - 配置 RolloverStrategy 以删除旧日志文件