如何使用AWS Lambda PowerTools Logger过滤健康检查API日志
如何在AWS Lambda Powertools中过滤掉Uvicorn的/ping健康检查日志
我需要丢弃AWS CloudWatch日志中每20秒由Terraform健康检查触发的INFO: 127.0.0.1:51927 - "GET /ping HTTP/1.1" 200 OK日志行(该健康检查无法禁用)。尝试用logging的Filter类实现过滤,但aws_lambda_powertools.logging模块没有Filter属性,执行时报错。
尝试的代码
import os from aws_lambda_powertools import Logger, logging class EndpointFilter(logging.Filter): def filter(self, record: logging.LogRecord) -> bool: return record.getMessage().find("/ping") == -1 def get_aws_powertool_logger(): date_format = "%Y-%m-%dT%H:%M:%S.%f%z" service = os.path.basename(os.getcwd()) print("---- logger---- ", service) # logger: Logger = Logger(service=service, datefmt=date_format, level="DEBUG") logger = logging.getLogger("uvicorn.access").addFilter(EndpointFilter()) return logger
报错信息
class EndpointFilter(logging.Filter): AttributeError: module 'aws_lambda_powertools.logging' has no attribute 'Filter'
解决方案
问题核心是你导入的logging是AWS Lambda Powertools封装的模块,而非Python标准库的logging。Filter类属于标准库logging,需要调整导入逻辑,同时正确处理Uvicorn日志器和Lambda Powertools Logger的关系:
import os import logging # 导入Python标准库的logging模块 from aws_lambda_powertools import Logger class EndpointFilter(logging.Filter): def filter(self, record: logging.LogRecord) -> bool: # 过滤掉包含/ping的日志记录 return "/ping" not in record.getMessage() def get_aws_powertool_logger(): date_format = "%Y-%m-%dT%H:%M:%S.%f%z" service = os.path.basename(os.getcwd()) # 初始化Lambda Powertools的Logger实例 logger = Logger(service=service, datefmt=date_format, level="DEBUG") # 获取Uvicorn的access日志器并添加自定义过滤器 uvicorn_access_logger = logging.getLogger("uvicorn.access") uvicorn_access_logger.addFilter(EndpointFilter()) return logger
关键说明
- 必须导入标准库的
logging模块,Filter类和LogRecord类型都来自这里 - 单独初始化Lambda Powertools Logger,同时针对
uvicorn.access日志器添加过滤规则,不影响Powertools Logger的原有功能 - 过滤逻辑用
not in替代find,代码更直观易读
内容的提问来源于stack exchange,提问作者iamabhaykmr
相关产品推荐
相关产品推荐

