python - Python 记录器的 C 风格与 Python 风格字符串格式

标签 python logging

我是 Django 新手,一直在玩日志记录。在我看来,以下 info() 语句本质上是等效的:

log = logging.getLogger(__name__)
.
.
.
    log.info("This is a %s" % "test")  # Python style
    log.info("This is a %s", "test")   # C style

有什么区别吗?就我个人而言,我一直喜欢能够在任何地方使用 Python 风格的格式,并且我倾向于坚持使用这种方法。 Python 格式化还有很多内容,因此它看起来更强大。为什么 Django 给我们选择?使用 C 风格有什么优势吗?

最佳答案

多参数样式延迟了格式化的时间。这使得日志记录模块的其他部分有机会在最终格式化之前对这些参数进行操作,甚至只是选择忽略调用。

作为查尔斯·达菲 points outlogging flow diagram 的第一步是检查是否为调用级别启用了记录器。如果未启用日志记录级别,则甚至不会创建 LogRecord。因此,在这些情况下,延迟格式化可以节省程序的计算周期。


此延迟的另一个可能用途是 logging.Filters可以在参数格式化之前对其进行处理:

import logging

class ContextFilter(logging.Filter):
    def filter(self, record):
        for key in record.args:
            record.args[key] = ' '.join(record.args[key].upper())
        return True

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
filt = ContextFilter()
logger.addFilter(filt)

logger.info("'Twas %(adj)s, and the slithy %(noun)s", {'adj': 'brillig', 'noun': 'toves'})

日志

INFO:__main__:'Twas B R I L L I G, and the slithy T O V E S

请注意,参数 brilligtoves 已大写并由 ContextFilter 分隔。如果 logger.info 仅接受预先格式化的字符串,则您将无法执行此操作(无需强制用户执行 ContextFilter 的工作 before 调用 logger.info)。


过滤器还可以用于(令人惊讶!)在记录发出之前过滤掉记录(通过返回 False 而不是 True)。延迟格式化允许过滤器检查并可能根据参数值过滤掉记录。因此,在不需要时可以完全避免字符串格式化。

关于python - Python 记录器的 C 风格与 Python 风格字符串格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48671699/

相关文章:

logging - 为什么 Google Chrome 会将相同的 console.log 消息分组?

angularjs - Angular Analytics Splunk日志记录

c# - 如果使用 Enterprise Library,log4net 是否更适合登录?

java - 如何在 PostgreSQL JDBC/HikariCP 中启用调试日志记录?

python - 如何将命令行的输出转换为脚本中的条件?

python .bash_profile 别名

python - NDB BlobProperty 'compressed' 选项,可以随后设置吗?

python - pyqt4网页隐藏窗口标题栏

python - django:单元测试来自响应和 session 的 html 标签

tomcat - 为 Tomcat 转换 log4j.properties 文件以使用 Log4j2