如何配置Python日志以指定格式化风格(百分号/括号/F-string)
Python logging指定格式化风格的配置方法
Python支持三种主流的字符串格式化风格:
- 旧风格(百分号%):
"The first number is %s" % (1,) - 新风格(str.format/{}):
"The first number is {}".format(1) - F-string:
one = 1; f"the first number is {one}"
手动在日志调用时提前格式化字符串(比如log.error("the first number is {}".format(1)))存在两个问题:一是当日志级别未启用时,格式化操作白做,浪费性能;二是格式化复杂对象时容易触发意外的bug。下面是让logging自动处理格式化、指定对应风格的配置方法:
1. 旧风格(百分号%)
这是Python logging模块的默认格式化风格,无需额外配置,直接在日志调用时传入格式化字符串和参数即可,logging会在确定要输出日志时才执行格式化:
import logging logging.basicConfig(level=logging.ERROR) logging.error("The first number is %s", 1)
2. 新风格(str.format/{})
需要显式指定Formatter的style参数为'{',有两种配置方式:
全局基础配置
通过basicConfig直接指定:
import logging logging.basicConfig( level=logging.ERROR, format="%(levelname)s: The first number is {0}", style='{' # 指定使用str.format风格 ) logging.error(1)
自定义Formatter(适用于复杂日志配置)
如果需要给不同Handler配置不同格式,可以自定义Formatter并绑定:
import logging # 创建Formatter并指定风格 formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - {message}", style='{' ) # 创建Handler并绑定Formatter handler = logging.StreamHandler() handler.setFormatter(formatter) # 配置Logger logger = logging.getLogger(__name__) logger.addHandler(handler) logger.setLevel(logging.ERROR) # 调用日志 logger.error("The first number is {}", 1)
3. F-string
F-string是即时求值的,无法直接让logging延迟格式化。要实现“仅当日志输出时才格式化”的效果,可以通过包装函数实现:
import logging def log_error(msg_provider, *args, **kwargs): # 先判断当前日志级别是否启用,避免无效计算 if logging.getLogger(__name__).isEnabledFor(logging.ERROR): logging.error(msg_provider(), *args, **kwargs) # 使用示例 one = 1 log_error(lambda: f"The first number is {one}")
这种方式通过lambda将F-string的格式化逻辑延迟到日志需要输出时才执行,兼顾了F-string的简洁性和logging的性能优势。
内容的提问来源于stack exchange,提问作者loopbackbee
相关产品推荐
相关产品推荐

