为 AWS lambda 指定日志组?

问题描述 投票:0回答:7

有没有办法指定 AWS lambda 记录到的 CloudWatch 日志组?它似乎是直接从 lambda 名称生成的;然而,例如,将多个 lambda 聚合到单个日志组会特别方便。我们对在 CloudFormation 模板创建 lambda 时指定日志组特别感兴趣。

amazon-web-services aws-lambda aws-cloudformation amazon-cloudwatch
7个回答
44
投票

事实上,也许你可以,至少在某种程度上。我也在寻找答案并尝试了一下。这是两个资源的片段; lambda 函数和对数组:

"MyLambdaFunction": {
    "Type": "AWS::Lambda::Function",
    "DependsOn": "ReadWriteRole",
    "Properties": {
        //snip
    }
},

"MyLambdaFunctionLogGroup": {
    "Type": "AWS::Logs::LogGroup",
    "DependsOn": "MyLambdaFunction",
    "Properties": {
        "LogGroupName": {"Fn::Join": ["", ["/aws/lambda/", {"Ref": "MyLambdaFunction"}]]},
        "RetentionInDays": 14
    }
},

我发现创建的日志组的保留期为 14 天,如图所示。当 lambda 函数运行时,它会在该组中创建日志流。然而,当我删除堆栈时,日志组似乎“没有”被删除,并且保留现在设置为“永不过期”。也许这已经足够好了,所以流不会变得太失控...... 我认为这是不可能的。


32
投票
可以写入相同的日志流(当重用 lambda 实例时),但对于不同的 lambda 来说绝对不会出现这种情况(因为它们必须使用不同的 lambda 实例)。

因此,你必须有一个聚合多个日志流的工具。如果是这样,让它更通用一点有什么问题,以便它可以聚合来自不同日志组的日志流?

我发现@lingrlongr的答案部分正确。

首先,要回答原来的问题,您不能为要写入的 lambda 函数指定自定义日志组名称。

lambda 日志组名称始终遵循以下模式:

22
投票
/aws/lambda/<function-name>

lambda 函数将首先检查是否存在具有该名称的日志组。

如果存在,那么它将使用它。

如果不存在,它将创建具有该模式的日志组。

因此,如果您想要添加设置,例如
    RetentionInDays
  • SubscriptionFilter
  • ,请确保您的 CloudFormation 或 SAM 模板在 lambda 函数之前创建
  • LogGroup

before

。如果先创建 lambda 函数,则在创建 LogGroup 时会抛出错误,指出 LogGroup 已存在。因此,lambda 函数应该具有 
DependsOn: LogGroup
,而不是相反。 
此外,请确保您没有使用 
RefGetAtt
 来引用 LogGroup 内的 lambda 函数,因为这会创建对 lambda 函数的隐式依赖关系,导致 lambda 函数在 LogGroup 之前创建。

创建作为答案之一提到的日志组是可行的。要在删除堆栈后保留保留策略,只需添加 DeletionPolicy 即可。
"MyLambdaFunctionLogGroup": {
  "Type": "AWS::Logs::LogGroup",
  "DependsOn": "MyLambdaFunction",
  "DeletionPolicy": "Retain",
  "Properties": {
    "LogGroupName": {"Fn::Join": ["", ["/aws/lambda/", {"Ref": "MyLambdaFunction"}]]},
    "RetentionInDays": 14
  }
}


9
投票
我将 LogGroup 附加到 SAM 模板中的 Serverless 函数,如下所示:

MyFuncLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: '/aws/lambda/stackName-env-myFunc-v1' RetentionInDays: 30 MyFunc: Type: AWS::Serverless::Function Properties: FunctionName: 'stackName-env-myFunc-v1' ...
一些用户提到了 

5
投票
属性的要求,但根据我使用 SAM 的经验,这不是必需的。唯一的要求是 LogGroupName 必须是

/aws/lambda/<FunctionName>

。只要您没有在 LogGroup 中引用函数的逻辑 ID,SAM 就会在 lambda 函数之前创建日志组

此外,如果要将 LogGroup 添加到现有函数中,只需使用上面的 LogGroup 资源更新 template.yaml 并将 FunctionName 属性添加到函数资源中即可。显然,FunctionName 应与 lambda ARN 中出现的现有 lambda 函数名称不同。

警告
:FunctionName 属性需要替换。您现有的 lambda 将被删除,并创建新的 lambda。

好吧,所以我必须自己做这件事,@pat-myron 在答案下面评论了一个指向你如何做的链接。

他发布了一个功能请求,其中 @benbridts 概述了模板这里


5
投票

HelloWorldLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: "/aws/lambda/HelloWorld" RetentionInDays: 30 HelloWorldFunction: Type: AWS::Lambda::Function DependsOn: HelloWorldLogGroup Properties: FunctionName: HelloWorld Role: Fn::GetAtt: - LambdaExecRole - Arn LambdaExecRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: LambdaLogging PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - logs:CreateLogStream - logs:PutLogEvents Resource: !GetAtt HelloWorldLogGroup.Arn

自 2023 年 11 月起,您现在可以在创建 Lambda 函数时指定 CloudWatch Logs 日志组名称。

在您的

Lambda 函数
的 CloudFormation 中,您可以指定日志组名称,如下所示:

0
投票

请注意,您还可以指定以前无法执行的应用程序日志级别(DEBUG | ERROR | FATAL | INFO | TRACE | WARN)和系统日志级别(DEBUG | INFO | WARN)以及日志格式。

© www.soinside.com 2019 - 2024. All rights reserved.