structlog配置filter_by_level后调用setLevel提示PrintLogger无该属性咨询
structlog调用
logger.setLevel()报错解决方法 报错原因
你遇到的报错是因为当前使用的structlog.PrintLoggerFactory生成的是仅支持基础打印功能的极简日志器,本身没有实现标准库logging的setLevel()接口。同时你配置中使用的structlog.stdlib.filter_by_level处理器本身就是为对接标准库日志器设计的,两者不匹配就会触发属性不存在的错误。
解决方案
方案1:更换为标准库LoggerFactory(推荐,适配现有配置)
这个方案可以完美兼容你已经配置的所有stdlib开头的处理器,同时支持setLevel()动态调整日志级别,还能复用标准库logging的所有扩展能力(比如日志轮转、多输出源配置等)。
修改后的配置示例:
import logging import structlog # 先完成标准库logging的基础初始化 logging.basicConfig(level=logging.INFO) structlog.configure( processors = [ structlog.stdlib.add_log_level, structlog.stdlib.add_log_level_number, structlog.processors.format_exc_info, structlog.stdlib.filter_by_level, structlog.processors.JSONRenderer(), ], wrapper_class = structlog.stdlib.BoundLogger, # 替换为标准库LoggerFactory logger_factory = structlog.stdlib.LoggerFactory(), cache_logger_on_first_use=True, )
修改后你获取的structlog logger就可以正常调用setLevel()方法,级别过滤逻辑也会按预期生效。
方案2:轻量级别过滤(无需引入标准库logging)
如果你只是写简单脚本,不需要动态调整日志级别、也不需要标准库的其他功能,可以直接替换级别过滤处理器,不需要修改logger_factory,也不需要调用setLevel():
import structlog structlog.configure( processors = [ structlog.stdlib.add_log_level, structlog.stdlib.add_log_level_number, structlog.processors.format_exc_info, # 替换为自带的LevelFilter,直接指定默认过滤级别 structlog.processors.LevelFilter(default_level="INFO"), structlog.processors.JSONRenderer(), ], wrapper_class = structlog.stdlib.BoundLogger, logger_factory = structlog.PrintLoggerFactory(), cache_logger_on_first_use=True, )
这种方案的日志级别是配置阶段固定的,不能在运行时通过setLevel()动态修改,适合简单场景使用。
内容的提问来源于stack exchange,提问作者Tamir Gefen
相关产品推荐
相关产品推荐

