Tengo algunas Lambdas basadas en node.js que registran datos.
Para consultar y filtrar correctamente los datos, etc., quiero registrar como datos JSON puros de mis Lambdas.
Sin embargo, cuando hago un console.log
regular, crea una cadena normal de datos.
console.log({a:1,b:2,x:"xxx"})
Resultados en esto:
2020-04-29T14:46:45.722Z 3f64c499-fbae-4a84-996c-5e5f0cb5302c INFO { a: 1, b: 2, x: 'xxx' }
La línea registrada anterior no parece que se pueda buscar como JSON utilizando las diversas opciones de coincidencia de filtros en CloudWatch.
Intenté llamar a la API de AWS.CloudWatchLogs
directamente, pero como uso lambda no puedo mantener un token entre las invocaciones de las funciones, por lo que no estoy seguro de que ese sea el camino a seguir.
¿Alguien más ha tenido éxito al registrar JSON sin procesar desde un Javascript Lambda?
El problema es que console.log()
no va directamente a stdout/stderr. Puedes ver que usando este Lambda:
const process = require('process'); exports.handler = async (event) => { console.log("message 1"); process.stdout.write("message 2\n"); };
Si invoca eso, verá un resultado como este:
START RequestId: 6942bebc-1997-42cd-90c2-d76b44c637283 Version: $LATEST 2020-04-29T17:06:07.303Z 6935bebc-1d97-42cd-90c2-d76b4a637683 INFO message 1 message 2 END RequestId: 6942bebc-1997-42cd-90c2-d76b44c637283
Entonces, para obtener el resultado que desea, puede redefinir console.log
para ir a stderr o escribir en stdout/stderr directamente.
O podría usar un marco de registro que escribe en stdout/stderr, lo que puede brindarle más flexibilidad sobre cómo se escriben sus mensajes. No hago desarrollo de nodos, pero he oído que Winston es el marco de registro estándar.