我是 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 out ,logging flow diagram 的第一步是检查是否为调用级别启用了记录器。如果未启用日志记录级别,则甚至不会创建 LogRecord。因此,在这些情况下,延迟格式化可以节省程序的计算周期。
此延迟的另一个可能用途是 logging.Filter
s可以在参数格式化之前对其进行处理:
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
请注意,参数 brillig
和 toves
已大写并由 ContextFilter
分隔。如果 logger.info 仅接受预先格式化的字符串,则您将无法执行此操作(无需强制用户执行 ContextFilter 的工作 before 调用 logger.info
)。
过滤器还可以用于(令人惊讶!)在记录发出之前过滤掉记录(通过返回 False
而不是 True
)。延迟格式化允许过滤器检查并可能根据参数值过滤掉记录。因此,在不需要时可以完全避免字符串格式化。
关于python - Python 记录器的 C 风格与 Python 风格字符串格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48671699/