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

AWS Lambda中Python日志未在CloudWatch显示问题排查

问题原因与解决方案

核心原因

  1. 日志配置执行时机不匹配Lambda热启动机制:你将日志配置放在Model.py的模块级别代码中,这段代码仅在Lambda冷启动时执行一次;后续热启动时,模块已被缓存,配置代码不会重新运行,而Lambda环境可能重置了日志配置,导致自定义日志的级别过滤规则失效。
  2. Lambda默认日志级别干扰:Lambda的Python运行环境默认根日志级别为WARNING,若热启动时未重新覆盖该配置,你的INFO级自定义日志会被自动过滤。
  3. 日志器初始化顺序问题:你在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:CreateLogGroup
  • logs:CreateLogStream
  • logs:PutLogEvents
    默认Lambda执行角色已包含这些权限,若使用自定义角色需手动添加。

4. 统一日志输出方式

将代码中的print语句替换为logger输出,确保所有日志都通过logging系统处理:
比如把print(self.model.unprocessed)改为:

logger.info(f'Unprocessed items: {self.model.unprocessed}')

内容的提问来源于stack exchange,提问作者pyth0nEiken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:18:21