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

跨目录导入Azure日志装饰器后Azure端无日志输出问题

日志装饰器Azure日志不输出问题解决方案

问题核心

在FastAPI项目中,自定义日志装饰器用于auth/auth_handler.py中的接口函数时,仅能在控制台输出日志,Azure端无日志;但直接调用logger或在同级test.py中使用装饰器时,Azure日志正常输出,推测与目录结构相关。

排查方向与解决方法

1. 确认env_logger取值与日志配置匹配

装饰器中通过logging.getLogger(env_logger)获取日志实例,需确保:

  • env_logger在auth_handler.py模块中的取值为development(对应YAML配置中绑定了azureHandler的logger名称)。
  • 若env_logger被设置为模块名(如auth.auth_handler),而YAML中未配置该子logger,会默认继承root logger的handler,需确认root logger的azureHandler是否正常生效。

2. 确保日志配置加载时机正确

日志配置必须在装饰器被导入或使用前完成加载:

  • 在logger.py的模块级别执行YAML配置加载,而非在函数内部延迟加载。示例代码:
import logging.config
import yaml
import os

# 加载日志配置
with open(os.path.join(os.path.dirname(__file__), 'logging_config.yaml'), 'r') as f:
    config = yaml.safe_load(f)
logging.config.dictConfig(config)

# 根据环境变量设置logger名称
env_logger = os.getenv("LOGGER_ENV", "development")

# 定义装饰器
def log_function_call(func):
    # 提前获取logger,避免每次调用时重复初始化
    logger = logging.getLogger(env_logger)
    
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        properties = {
            "custom_dimensions": {
                "func_name": func.__name__,
                "elapsed": end_time - start_time,
                "args": args,
                "kwargs": kwargs,
                "return": result,
            }
        }
        logger.log(
            logging.INFO,
            msg=f"Calling {func.__name__} elapsed: {end_time-start_time}",
            extra=properties,
        )
        return result

    return wrapper
  • 若使用FastAPI,可在startup事件中再次确认配置加载,确保所有模块初始化前配置已生效:
from fastapi import FastAPI
import logger as lg

app = FastAPI()

@app.on_event("startup")
def load_logging_config():
    # 显式加载日志配置,确保生效
    lg.load_config()  # 需在logger.py中定义对应的加载函数

3. 优化装饰器中logger的初始化逻辑

将logger的获取移至装饰器外部(而非wrapper函数内部),确保logger实例在配置加载完成后创建,避免因模块导入顺序导致的handler未绑定问题。

4. 验证日志实例的handler绑定情况

在auth_handler.py的装饰器调用处添加调试代码,确认logger是否包含azureHandler:

# 在auth_handler.py中
import logger as lg
import logging

@lg.log_function_call
def my_api_func():
    # 调试:打印当前装饰器中使用的logger的handler
    logger = logging.getLogger(lg.env_logger)
    print([h.__class__.__name__ for h in logger.handlers])
    return "ok"

若输出中没有AzureLogHandler,则说明logger未正确绑定handler,需检查配置加载或logger名称是否正确。


内容的提问来源于stack exchange,提问作者Piergiorgio Di Pasquale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:38:22