Skip to content

Instantly share code, notes, and snippets.

@matthewpick
Last active April 25, 2024 06:23
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matthewpick/3aa01abfeda36eae717837a99994d3ed to your computer and use it in GitHub Desktop.
Save matthewpick/3aa01abfeda36eae717837a99994d3ed to your computer and use it in GitHub Desktop.
AWS Lambda universal logging formatter (retain aws_request_id in log output)
import logging
import os
def setup_logging_format(log_level=logging.INFO, override_existing_loggers=True):
"""
Logger formatter that works locally and in AWS lambda
:param log_level: Level of logging
:param override_existing_loggers: Flag for overriding the formatting of all existing loggers
:return:
"""
running_in_aws = os.environ.get("AWS_EXECUTION_ENV") is not None
delimiter = "\t" if running_in_aws else " "
log_items = [
'[%(levelname)s]',
'[%(asctime)s.%(msecs)dZ]',
"[%(aws_request_id)s]" if running_in_aws else None,
'[%(module)s::%(funcName)s:%(lineno)d]',
'%(message)s'
]
log_format = delimiter.join(filter(None, log_items))
date_fmt = "%Y-%m-%d %H:%M:%S"
if running_in_aws:
log_format += "\n" # extra new-line expected in AWS
# Make changes to lambda's default logger (this allows us to retain aws_request_id in log output)
# https://github.com/aws/aws-lambda-python-runtime-interface-client/blob/2.0.8/awslambdaric/bootstrap.py#L448-L451
if override_existing_loggers:
root = logging.getLogger()
root.setLevel(log_level)
for handler in root.handlers:
handler.setFormatter(
logging.Formatter(
fmt=log_format,
datefmt=date_fmt,
)
)
logging.basicConfig(
level=log_level,
format=log_format,
datefmt=date_fmt,
)
import json
import logging
from aws_logging_util import setup_logging_format
setup_logging_format()
log = logging.getLogger(__name__)
def lambda_handler(event, _context):
log.info('processing event: %s', event)
another_method()
return {
'statusCode': 200,
'event': json.dumps(event)
}
def another_method():
log.info('Logging within a method')
if __name__ == '__main__':
lambda_handler({"test_event": "Test"}, None)
# EXAMPLE LOG OUTPUTS:
# Function Logs
# START RequestId: 7fb639de-3564-4929-9249-dd1d22ef9456 Version: $LATEST
# [INFO] [2024-01-11 23:12:26.897Z] [7fb639de-3564-4929-9249-dd1d22ef9456] [lambda_function::lambda_handler:11] processing event: {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
# [INFO] [2024-01-11 23:12:26.897Z] [7fb639de-3564-4929-9249-dd1d22ef9456] [lambda_function::another_method:20] Logging within a method
# END RequestId: 7fb639de-3564-4929-9249-dd1d22ef9456
# REPORT RequestId: 7fb639de-3564-4929-9249-dd1d22ef9456 Duration: 1.89 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 38 MB Init Duration: 110.48 ms
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment