我们将 Node.js 函数部署到 AWS Lambda 上。调用它们时,它们会自动生成 AWS CloudWatch 日志。日志组设置为 Lambda 函数的名称,这很有帮助。但日志流的命名如下:2018/02/14/[$LATEST]794dbaf40a7846c4984ad80ebf110544
。
这在搜索错误时没有帮助,因为我需要检查多个日志流,因为我不知道哪一个是正确的。
有什么方法可以定义日志流名称,以便人类更容易阅读吗?
node.js 代码看起来与此类似:
exports.handler = function (event, context) {
console.log('Called "' + context.functionName + '" with AWS-Request-Id "' + context.awsRequestId + '"');
// do sth. here
};
最佳答案
检查您的函数的上下文。它具有属性context.logStreamName
。您可以将其更改为任何唯一的名称。
请记住,如果您想将日志附加到现有流,则必须保留其 token 。这就是我为每个 lambda 调用创建新日志流的原因。另外,我使用 guid 来创建流名称(例如:创建日志的原因 + guid()
,时间戳也可以)。
查看下一篇文章中的更多详细信息 - The Context Object (Node.js)
编辑:不要注意我之前的回答。这是完全错误的。
我检查了我的代码如何实现相同的功能。无法从上下文中更改组或流名称。但你可以使用 CloudWatchLogs在您的代码中将日志放入特定的组和流中。
我的代码:
var AWS = require('aws-sdk');
exports.handler = (event, context, callback) => {
// TODO implement
var cloudwatchlogs = new AWS.CloudWatchLogs({ apiVersion: '2014-03-28' });
// create new stream name for each request
// because I don't persist sequenceToken
var logStreamName = "myStreamName" + Math.random()
var params = {
logGroupName: 'myLogGroup',
logStreamName: logStreamName
};
cloudwatchlogs.createLogStream(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else {
var params = {
logEvents: [{
message: 'log message',
timestamp: new Date().getTime()
},
{
message: 'one more log message',
timestamp: new Date().getTime()
}
],
logGroupName: 'myLogGroup',
logStreamName: logStreamName
};
cloudwatchlogs.putLogEvents(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
}
});
callback(null, 'Hello from Lambda');
};
这种方法的缺点是:
- 您的 lambda 相应地创建了两个 logGroup 和两个 logStream。一个是你的 lambda,另一个是定制的。
console.log('')
写入 lambda 日志,putLogEvents
写入您的自定义日志(即:myStreamName0.10141409975385463)。请注意这一点。 - 您必须手动创建“myLogGroup”(我就是这样做的)或实现代码来创建一个 logGroup(如果它不存在)。
我的作品流名称比名称+随机更有意义。他们使用 guid 或时间戳作为后缀。我认为使用随机是不安全的。
关于node.js - 设置 AWS Lambda 调用的 LogStreamName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48792788/