Uso del registro de Python con AWS Lambda

Resuelto p.magalhaes asked hace 54 años • 11 respuestas

Como sugiere la documentación de AWS:

import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def my_logging_handler(event, context):
    logger.info('got event{}'.format(event))
    logger.error('something went wrong')

Ahora hice:

import logging
logging.basicConfig(level = logging.INFO)
logging.info("Hello World!")

El primer fragmento de código se imprime en la Cloud Watchconsola, pero el segundo no.

No vi ninguna diferencia ya que los dos fragmentos usan el registrador raíz.

p.magalhaes avatar Jan 01 '70 08:01 p.magalhaes
Aceptado

La razón por la que el registro no parece funcionar es porque el tiempo de ejecución de AWS Lambda Python preconfigura un controlador de registro que, según la versión del tiempo de ejecución seleccionada, podría modificar el formato del mensaje registrado y también podría agregar algunos metadatos al registrar si está disponible. Sin embargo, lo que no está preconfigurado es el nivel de registro. Esto significa que no importa el tipo de mensaje de registro que intente enviar, en realidad no se imprimirá.

Como se documenta AWS , para usar correctamente la loggingbiblioteca en el contexto de AWS Lambda, solo necesita configurar el nivel de registro para el registrador raíz:

import logging
logging.getLogger().setLevel(logging.INFO)

Si desea que su script de Python sea ejecutable en AWS Lambda, pero también con su intérprete de Python local, puede verificar si un controlador está configurado o no y, basicConfigde lo contrario, recurrir a (que crea el controlador stderr predeterminado):

if len(logging.getLogger().handlers) > 0:
    # The Lambda environment pre-configures a handler logging to stderr. If a handler is already configured,
    # `.basicConfig` does not execute. Thus we set the level directly.
    logging.getLogger().setLevel(logging.INFO)
else:
    logging.basicConfig(level=logging.INFO)
Pit avatar Jun 13 '2019 11:06 Pit

Copiado directamente de la respuesta superior en la pregunta a la que se vincula la respuesta de @StevenBohrer (esto funcionó para mí, reemplazando la última línea con mi propia configuración):

root = logging.getLogger()
if root.handlers:
    for handler in root.handlers:
        root.removeHandler(handler)
logging.basicConfig(format='%(asctime)s %(message)s',level=logging.DEBUG)
 avatar Aug 10 '2017 21:08

He luchado con este problema exacto. La solución que funciona tanto localmente como en AWS CloudWatch es configurar el registro de esta manera:

import logging

# Initialize you log configuration using the base class
logging.basicConfig(level = logging.INFO)

# Retrieve the logger instance
logger = logging.getLogger()

# Log your output to the retrieved logger instance
logger.info("Python for the win!")

Kinman avatar Jul 03 '2019 22:07 Kinman