为 AWS Lambda 调用设置 LogStreamName

Tob*_*ias 5 amazon-web-services node.js amazon-cloudwatch aws-lambda

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

AWS CloudWatch 日志流

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

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

node.js 代码如下所示:

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

Rre*_*Cat 7

检查你的函数的上下文。它有财产context.logStreamName。您可以将其更改为任何唯一的名称。

请记住,如果要将日志附加到现有流,则必须保留其令牌。这就是我为每个 lambda 调用创建新日志流的原因。另外,我使用 guid 来创建流名称(例如:reason why log created + guid(),时间戳也可以)。

在下一篇文章中查看更多详细信息 - Context 对象 (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');
};
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点是:

  • 您的 lambda 相应地创建了两个 logGroup 和两个 logStream。一个是你的 lambda,另一个是定制的。console.log('')写入 lambda 日志,putLogEvents写入您的自定义日志(即:myStreamName0.10141409975385463)。请注意这一点。
  • 您必须手动创建“myLogGroup”(我就是这样做的)或实现代码来创建一个 logGroup(如果它不存在)。

该测试代码的结果如下所示: 在此输入图像描述

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