AWS Lambda中Python日志文件LOG创建后为空的问题求助
问题原因
AWS Lambda运行环境会预先配置root logger的handler(用于将日志输出到CloudWatch),而Python的logging.basicConfig函数仅在root logger没有任何已注册handler时才会执行配置逻辑。这就导致你代码里的basicConfig在Lambda中完全没生效——FileHandler根本没被添加到root logger上,所以LOG文件虽然被创建,但没有任何日志写入,最终为空。
而你的slow_logger是自定义的独立logger,手动添加了FileHandler且禁用了传播,不受Lambda预配置的root logger影响,所以能正常生成日志。
解决方案
推荐两种处理方式,根据你的需求选择:
方式一:手动配置root logger
绕过basicConfig,直接获取root logger并手动添加所需的handler,确保配置生效:
import logging import uuid LOG = f"/tmp/{uuid.uuid1()}_log.log" SLOW_LOG = f"/tmp/{uuid.uuid1()}_slow.log" # 获取root logger并设置级别 root_logger = logging.getLogger() root_logger.setLevel(logging.INFO) # 配置FileHandler file_handler = logging.FileHandler(LOG) formatter = logging.Formatter("%(levelname)s - %(message)s") file_handler.setFormatter(formatter) root_logger.addHandler(file_handler) # 保留StreamHandler(可选,用于输出到CloudWatch) stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) root_logger.addHandler(stream_handler) # 慢请求logger配置保持不变 slow_logger = logging.getLogger("slow_requests") slow_logger.setLevel(logging.INFO) slow_logger.propagate = False slow_file_handler = logging.FileHandler(SLOW_LOG) slow_file_handler.setFormatter(formatter) slow_logger.addHandler(slow_file_handler)
如果不想让root logger同时输出到CloudWatch,可以先移除Lambda默认的handler:
# 在添加新handler前移除默认handler for handler in root_logger.handlers[:]: root_logger.removeHandler(handler)
方式二:使用自定义logger处理普通日志
和慢请求logger一样,创建独立的自定义logger来处理普通日志,完全避开Lambda预配置的root logger:
import logging import uuid LOG = f"/tmp/{uuid.uuid1()}_log.log" SLOW_LOG = f"/tmp/{uuid.uuid1()}_slow.log" # 普通日志的自定义logger normal_logger = logging.getLogger("normal_requests") normal_logger.setLevel(logging.INFO) normal_logger.propagate = False # 禁止日志传播到root logger # 添加FileHandler file_handler = logging.FileHandler(LOG) formatter = logging.Formatter("%(levelname)s - %(message)s") file_handler.setFormatter(formatter) normal_logger.addHandler(file_handler) # 添加StreamHandler输出到CloudWatch(可选) stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) normal_logger.addHandler(stream_handler) # 慢请求logger配置保持不变 slow_logger = logging.getLogger("slow_requests") slow_logger.setLevel(logging.INFO) slow_logger.propagate = False slow_file_handler = logging.FileHandler(SLOW_LOG) slow_file_handler.setFormatter(formatter) slow_logger.addHandler(slow_file_handler)
之后使用normal_logger.info("xxx")来记录普通日志即可。
内容的提问来源于stack exchange,提问作者PloniStacker
相关产品推荐
相关产品推荐

