【问题标题】:What is the best way to monitor AWS cloudwatch logs across multiple applications?跨多个应用程序监控 AWS cloudwatch 日志的最佳方式是什么?
【发布时间】:2018-01-08 11:25:08
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 很高兴编写自定义函数,但似乎没有简单的方法可以跨应用程序从 AWS 日志文件发送过滤后的事件
    【解决方案2】:

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

    语言: Javascript (NodeJs)

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

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

    名称: LambdaLogger

    Lambda代码:可以根据传入的level添加条件,调用具体的日志函数,即:console.error,或者console.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.
    };
    

    希望对您有所帮助!

    【讨论】:

    • 你知道我实际上正在考虑这样的事情,我要么直接使用 SNS 发布,要么让另一个 lambda 来处理它。它不像我最初想要的那样做(更高级别),但它是我可能需要依赖的替代方案。
    • 可能是触发 Lambda 函数的 SNS。我希望它可以帮助你找到一种方法来完成你的场景。
    • 这会增加更多延迟。到你的调用。
    【解决方案3】:

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

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

    文档:Streaming CloudWatch Logs Data to Amazon Elasticsearch Service

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      相关资源
      最近更新 更多