跨目录导入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
相关产品推荐
相关产品推荐

