Uso del registro de Python con AWS Lambda
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 Watch
consola, pero el segundo no.
No vi ninguna diferencia ya que los dos fragmentos usan el registrador raíz.
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 logging
biblioteca 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, basicConfig
de 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)
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)
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!")