AWS Lambda中Python日志未在CloudWatch显示问题排查
问题原因与解决方案
核心原因
- 日志配置执行时机不匹配Lambda热启动机制:你将日志配置放在
Model.py的模块级别代码中,这段代码仅在Lambda冷启动时执行一次;后续热启动时,模块已被缓存,配置代码不会重新运行,而Lambda环境可能重置了日志配置,导致自定义日志的级别过滤规则失效。 - Lambda默认日志级别干扰:Lambda的Python运行环境默认根日志级别为
WARNING,若热启动时未重新覆盖该配置,你的INFO级自定义日志会被自动过滤。 - 日志器初始化顺序问题:你在
Model.py中先获取日志器、再执行basicConfig,虽然理论上子日志器会继承根配置,但实际环境中可能导致已创建的日志器未正确同步根日志的新级别。
解决步骤
1. 将日志配置移至入口函数内部
把日志配置逻辑放到lambda_function.py的lambda_handler函数最开头,确保每次函数调用(包括热启动)都能强制应用日志配置:
import logging def lambda_handler(event, context): # 强制初始化日志配置,覆盖Lambda默认设置 logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO, force=True, datefmt='%Y-%m-%d %H:%M:%S' ) # 后续业务逻辑导入与执行 from Controller import Controller controller = Controller() controller.csv_tmp() # ...其他代码
注意:将模块导入放在日志配置之后,避免导入过程中日志器提前初始化。
2. 显式设置自定义日志器级别(可选)
在每个自定义模块的日志器初始化后,显式设置级别,确保继承根配置或强制生效:
比如在Controller.py和Bank下的模块中:
import logging logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # 显式绑定级别,避免继承异常
3. 检查Lambda执行角色权限
确认Lambda的执行角色拥有以下CloudWatch日志权限:
logs:CreateLogGrouplogs:CreateLogStreamlogs:PutLogEvents
默认Lambda执行角色已包含这些权限,若使用自定义角色需手动添加。
4. 统一日志输出方式
将代码中的print语句替换为logger输出,确保所有日志都通过logging系统处理:
比如把print(self.model.unprocessed)改为:
logger.info(f'Unprocessed items: {self.model.unprocessed}')
内容的提问来源于stack exchange,提问作者pyth0nEiken
相关产品推荐
相关产品推荐

