我遇到了一个我似乎无法轻易解决的问题。我有很多不同的lambda函数,每个函数都生成自己的日志。
我想要一种方法来处理所有这些日志文件并提醒我错误,包括日志消息,日志文件的详细信息以及发生的时间。
我找到了一种方法,我需要创建一个过滤精确错误消息的指标过滤器。虽然这有效,但这意味着我需要为每个lambda创建一个单独的过滤器。
是否有任何解决方案,我可以拥有一个lambda,可以轻松地从所有这些不同的日志文件中提供错误数据,而无需为每个日志文件手动设置指标过滤器?
答案 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.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.
};
希望有所帮助!
答案 2 :(得分:0)
在开始之前,如果来自不同Lambda函数的所有日志具有相同的格式,那将是理想的选择。这样,如果需要,可以更轻松地查询它们。我发现JSON格式非常适合使用CloudWatch和ElasticSearch(更多内容见下文)。
如果要聚合来自不同Lambda的日志,可以将它们全部流式传输到Amazon ElasticSearch。然后,Elasticsearch的UI(称为Kibana)将允许您查询这些聚合日志。
文档:Streaming CloudWatch Logs Data to Amazon Elasticsearch Service
如果您想自己处理日志文件,可以挂钩Lambda函数以收听多个CloudWatch日志。这样,此Lambda函数将接收与您的订阅过滤器匹配的日志事件,您可以随意使用它。