You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:39:03