我们将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
};
答案 0 :(得分:1)
您无法更改日志流名称。 Lambda函数的每个运行容器都会记录到不同的日志流中。
如果您希望将日志轻松地视为一个日志,则可以将它们流式传输到Amazon ElasticSearch Service,以便您可以使用Kibana浏览日志,或者使用awscli
之类的CLI工具进行汇总和在你的终端浏览它们。
答案 1 :(得分:1)
查看您的功能的上下文。它有属性 context.logStreamName
。您可以将其更改为任何唯一名称。
请注意,如果要将日志附加到现有流,则必须保留其令牌。这就是我为每个lambda调用创建新日志流的原因。另外,我使用guid创建流名称(例如:reason why log created + 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');
};
这种方法的缺点是:
console.log('')
写入lambda日志,putLogEvents
写入自定义日志(即:myStreamName0.10141409975385463)。请注意这一点。我的作品流名称更有意义,而不是名称+随机。他们使用guid或timestamp作为后缀。我不认为随机使用是安全的。