iamabhaykmr
iamabhaykmr

Reputation: 2011

How to use aws_lambda_powertools logger to filter/disable specific api endpoint logs like health check /ping api

I tried to follow this general logging class filter() method but the method doesn't exist in aws_lambda_powertools logging and it throws an error. I am doing this to discard INFO: 127.0.0.1:51927 - "GET /ping HTTP/1.1" 200 OK rows in the aws cloud watch log as it gets fired every 20 sec through terraform health check which we can't disable.

Code I tried:

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

Error I am getting:

  class EndpointFilter(logging.Filter):
AttributeError: module 'aws_lambda_powertools.logging' has no attribute 'Filter'

Refrence: https://github.com/encode/starlette/issues/864

Any help is highly appreciated. Thanks in advance.

Upvotes: 1

Views: 705

Answers (2)

fucalost
fucalost

Reputation: 522

Modify the Lambda function’s execution role to remove CloudWatch logging permissions.

Upvotes: 0

iamabhaykmr
iamabhaykmr

Reputation: 2011

I managed to fix the error in the question but still logs are getting printed on terminal and getting recorded in cloudwatch logs.

import os
from aws_lambda_powertools import Logger
import logging
import typing as t

class EndpointFilter(logging.Filter):
    def __init__(
        self,
        path: str,
        *args: t.Any,
        **kwargs: t.Any,
    ):
        super().__init__(*args, **kwargs)
        self._path = path

    def filter(self, record: logging.LogRecord) -> bool:
        return record.getMessage().find(self._path) == -1

def get_aws_powertool_logger():
    date_format = "%Y-%m-%dT%H:%M:%S.%f%z"
    service = os.path.basename(os.getcwd())
    logger: Logger = Logger(service=service, datefmt=date_format, level="INFO")
    logger.addFilter(EndpointFilter("/ping"))
    return logger

Upvotes: 0

Related Questions