【发布时间】:2019-10-26 23:34:22
【问题描述】:
当使用 console.log 将日志行添加到 AWS CloudWatch 时,Lambda 请求 ID 将作为 described in the docs 添加到每一行中
基于上述文档的简化示例
exports.handler = async function(event, context) {
console.log("Hello");
return context.logStreamName
};
会产生诸如
之类的输出START RequestId:c793869b-ee49-115b-a5b6-4fd21e8dedac 版本:$LATEST
2019-06-07T19:11:20.562Z c793869b-ee49-115b-a5b6-4fd21e8dedac 信息您好
END RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac
报告请求 ID:c793869b-ee49-115b-a5b6-4fd21e8dedac 持续时间:170.19 毫秒计费持续时间:200 毫秒内存大小:128 MB 最大已用内存:73 MB
此处有关此问题的相关详细信息是请求 ID,c793869b-ee49-115b-a5b6-4fd21e8dedac,它添加在带有“Hello”的行的时间戳之后。
AWS 文档说明
要从函数代码输出日志,您可以使用控制台对象上的方法,或任何写入 stdout 或 stderr 的日志库。
Node.js 运行时记录每次调用的 START、END 和 REPORT 行,并为函数记录的每个条目添加时间戳、请求 ID 和日志级别。
当使用 Winston 作为记录器时,请求 ID 会丢失。可能是使用格式化程序或传输器发出的。记录器的创建方式类似于
const logger = createLogger({
level: 'debug',
format: combine(
timestamp(),
printf(
({ timestamp, level, message }) => `${timestamp} ${level}: ${message}`
)
),
transports: [new transports.Console()]
});
我还尝试了simple() 格式化程序而不是printf(),但这对请求 ID 是否存在没有影响。同样完全删除格式仍然会打印纯文本,即没有时间戳或请求 ID。
我还检查了 Winston 控制台传输的源代码,它使用 console._stdout.write(如果存在)或 console.log 进行编写,这就是 AWS 文档所说的支持。
有没有办法配置 Winston 以将 AWS Lambda 请求 ID 作为消息的一部分?
附:我知道 AWS CloudWatch 有单独的 Winston 传输,但它们需要其他设置功能,我希望尽可能避免。而且由于请求 ID 很容易获得,因此它们看起来有点过头了。
附言请求 ID 也可以从 Lambda 上下文和用它初始化的自定义记录器对象中获取,但我也想避免这种情况,几乎出于相同的原因:为应该随时可用的东西做额外的工作。
【问题讨论】:
标签: amazon-web-services aws-lambda winston amazon-cloudwatchlogs