跨多个应用程序监控AWS cloudwatch日志的最佳方法是什么?

时间:2018-01-08 11:25:09

标签: amazon-web-services lambda amazon-cloudwatchlogs

我遇到了一个我似乎无法轻易解决的问题。我有很多不同的lambda函数,每个函数都生成自己的日志。

我想要一种方法来处理所有这些日志文件并提醒我错误,包括日志消息,日志文件的详细信息以及发生的时间。

我找到了一种方法,我需要创建一个过滤精确错误消息的指标过滤器。虽然这有效,但这意味着我需要为每个lambda创建一个单独的过滤器。

是否有任何解决方案,我可以拥有一个lambda,可以轻松地从所有这些不同的日志文件中提供错误数据,而无需为每个日志文件手动设置指标过滤器?

3 个答案:

答案 0 :(得分:0)

您可能需要为此构建自定义解决方案,其中包括在lambda函数中编写一些监视/跟踪代码。您可以使用IOPipe(http://theburningmonk.com/2017/09/tips-and-tricks-for-logging-and-monitoring-aws-lambda-functions/)之类的东西来获得更加严密的监控和警报。

答案 1 :(得分:0)

我认为您可以创建另一个简单的Lambda函数来记录它收到的每个调用。

语言: Javascript(NodeJs)

例如,有效负载如下所示:

{ 
    "identifier": "LambdaName(Caller)",
    "level": "ERROR",
    "message": "This a log"
}

名称: LambdaLogger

Lambda代码:您可以根据传递的level添加条件并调用特定的日志功能,即:console.errorconsole.log,等等上。

"use strict";

/**
 * This handler only logs the received event data.
 */
exports.handler = (event, context, callback) => {
    console.log("[" + event.level + "] - Caller [" + event.identifier + "] - " + event.message);
};

现在,在Cloudwatch上为LambdaLogger创建一个LogStream。

现在你只需要调用其他的Lambda函数。

例如:

创建一个名为setupLogger

的函数
var function setupLogger() {
    var lambda = new AWS.Lambda({region: AWS_REGION});
    console.log = function(msg) {
        var lambda = new AWS.Lambda({region: AWS_REGION});

        var params = {
            FunctionName: "LambdaLogger",
            InvocationType: 'Event',
            Payload: JSON.stringify({
                "identifier": "TheCurrentLambdaName",
                "level": "DEBUG",
                "message": msg
            })
        };

        lambda.invoke(params, function(err, data) {
            // Here you can get handle the response from the "logger".
        });
    };
};
  

上述函数应该存在于每个Lambda函数中,并且必须在代码的第一行执行。

exports.handler = (event, context, callback) => {
    var function setupLogger() {
        var lambda = new AWS.Lambda({region: AWS_REGION});
        console.log = function(msg) {
            var lambda = new AWS.Lambda({region: AWS_REGION});
            var params = {
                FunctionName: "LambdaLogger",
                InvocationType: 'Event',
                Payload: JSON.stringify({"identifier": "TheCurrentLambdaName", "level": "DEBUG", "message": msg
                })
            };
            lambda.invoke(params, function(err, data) { // Here you can get handle the response from the "logger".});
        };
    };

    setupLogger(); //this is the first line you need to execute.

    // Your lambda code

    console.log("Hello World!"); // This line is an example that will invoke the LambdaLogger and you will be able to check the LogStream of LambdaLogger.
};

希望有所帮助!

答案 2 :(得分:0)

在开始之前,如果来自不同Lambda函数的所有日志具有相同的格式,那将是理想的选择。这样,如果需要,可以更轻松地查询它们。我发现JSON格式非常适合使用CloudWatch和ElasticSearch(更多内容见下文)。

如果要聚合来自不同Lambda的日志,可以将它们全部流式传输到Amazon ElasticSearch。然后,Elasticsearch的UI(称为Kibana)将允许您查询这些聚合日志。

文档:Streaming CloudWatch Logs Data to Amazon Elasticsearch Service

如果您想自己处理日志文件,可以挂钩Lambda函数以收听多个CloudWatch日志。这样,此Lambda函数将接收与您的订阅过滤器匹配的日志事件,您可以随意使用它。

文档:Real-time Processing of Log Data with Subscriptions