aws / aws-lambda-python-runtime-interface-client

Apache License 2.0
265 stars 77 forks source link

Library is swallowing log messages from function code #38

Open synic opened 3 years ago

synic commented 3 years ago

I'm using logging messages in my python code, but none of those are ever visible. I'm currently configuring my logger like so:


formatter = json_log_formatter.JSONFormatter()
handler = logging.StreamHandler(sys.stdout)

if conf.USE_JSON_LOGGING:
    handler.setFormatter(formatter)

logging.basicConfig(
    level=logging.INFO,
    format='[%(asctime)s] {%(filename)s:%(lineno)d} %(levelname)s - %(message)s',  # noqa
    handlers=[handler],
)
logger = logging.getLogger(__name__)

However, I never see the logs. Where are they going?

juls858 commented 3 years ago

For whatever reason the lambda runtime interface client doesn't follow standard python logging. It definitely needs top e fixed. There is a logger in aws_lambda_powertools for bootstrapping the loggers and emits json logs as aws CloudWatch logs use structured logging. I assume this should work in cases where you are not using a lambda.

I ended having to do this to get logging to work for imported modules:

module being imported

# mymodule.py
import inspect
import logging

from aws_lambda_powertools import Logger

if os.path.basename(sys.modules["__main__"].__file__) == "app.py":
    # use aws lambda logger, formatter
    logger = Logger(child=True)
else:
    # use default logger
    logger = logging.getLogger(__name__)
    logger.addHandler(NullHandler())

Foo:
    ...

importing module

# lambda.py
from aws_lambda_powertools import Logger

from mymodule import Foo

def handler(event, context):
    Foo()