跳到内容

logging-string-format (G001)

派生自 flake8-logging-format linter。

作用

检查是否使用 str.format 格式化日志消息。

为什么这不好?

logging 模块提供了一种机制,可以使用 extra 关键字参数传递要记录的其他值。这比直接格式化字符串更一致、更有效且更不容易出错。

使用 str.format 格式化日志消息需要 Python 立即格式化字符串,即使日志语句从未执行(例如,如果日志级别高于日志语句的级别),而使用 extra 关键字参数会将格式化推迟到需要时。

此外,使用 extra 将确保这些值对所有处理程序都可用,然后可以配置这些处理程序以一致的方式记录这些值。

作为 extra 的替代方法,将值作为参数传递给日志记录方法也可以用于将字符串格式化延迟到需要时。

已知问题

此规则通过启发式方法检测 logging 模块的使用。具体来说,它匹配:

  • logging 模块本身的使用(例如,import logging; logging.info(...))。
  • flask.current_app.logger 的使用(例如,from flask import current_app; current_app.logger.info(...))。
  • 名称以 log 开头或以 loggerlogging 结尾的对象,当在定义它们的同一文件中使用时(例如,logger = logging.getLogger(); logger.info(...))。
  • 通过 lint.logger-objects 设置标记为记录器的导入对象,可用于针对共享记录器对象强制执行这些规则(例如,from module import logger; logger.info(...),当 lint.logger-objects 设置为 ["module.logger"] 时)。

示例

import logging

logging.basicConfig(format="%(message)s", level=logging.INFO)

user = "Maria"

logging.info("{} - Something happened".format(user))

建议改为

import logging

logging.basicConfig(format="%(user_id)s - %(message)s", level=logging.INFO)

user = "Maria"

logging.info("Something happened", extra={"user_id": user})

或者

import logging

logging.basicConfig(format="%(message)s", level=logging.INFO)

user = "Maria"

logging.info("%s - Something happened", user)

Options (选项)

参考