为AWS Lambda调用设置LogStreamName

时间:2018-02-14 17:14:24

标签: node.js amazon-web-services aws-lambda amazon-cloudwatch

我们将node.js功能部署到AWS Lambda上。在调用它们时,它们会自动生成AWS CloudWatch日志。日志组设置为Lambda函数的名称,这很有帮助。但是日志流的名称如下:2018/02/14/[$LATEST]794dbaf40a7846c4984ad80ebf110544

AWS CloudWatch Log Streams

在搜索错误时没有用,因为我需要检查多个日志流,因为我不知道哪一个是正确的。

有没有办法定义日志流名称,以便它对人类更具可读性?

node.js代码与此类似:

exports.handler = function (event, context) {
    console.log('Called "' + context.functionName + '" with AWS-Request-Id "' + context.awsRequestId + '"');
    // do sth. here
};

2 个答案:

答案 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');
};

这种方法的缺点是:

  • 您的lambda根据需要创建两个logGroup和两个logStream。你的一个lambda,另一个自定义。 console.log('')写入lambda日志,putLogEvents写入自定义日志(即:myStreamName0.10141409975385463)。请注意这一点。
  • 您必须手动创建' myLogGroup' (我是怎么做的)或实现代码,如果它不存在,将创建一个logGroup。

此测试代码的结果如下所示: enter image description here

我的作品流名称更有意义,而不是名称+随机。他们使用guid或timestamp作为后缀。我不认为随机使用是安全的。