node.js - 设置 AWS Lambda 调用的 LogStreamName

标签 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
};

最佳答案

检查您的函数的上下文。它具有属性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(如果它不存在)。

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

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

关于node.js - 设置 AWS Lambda 调用的 LogStreamName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48792788/

相关文章:

node.js - Mongoose 连接/模型 : Need to always run on open?

ios - 适用于 iOS 的 AWS 后端入门

amazon-web-services - 如何让帐户和所有 Lambda 都担任角色?

c# - 使用 dotnet core 2.1 的 AWS Lambda 函数中的依赖注入(inject)

node.js - Ubuntu 14 上的 Node 和 NVM 安装损坏。有什么想法我应该做什么吗?

node.js - 带有 Yarn 工作区的 Firebase 函数

node.js - 如何将对象数组推送到子文档

amazon-web-services - Cloudformation 自定义资源

python - 如何使用 python、boto3 获取 S3 存储桶本身的可下载 URL 而不是对象 URL?

aws-lambda - lambda 层中没有可用的包 zbar