Amazon Lambda不显示Python日志

8

我的API(Python)部署在Amazon Lambda上。问题是当我请求我的API时,我会收到内部服务器错误。我可以查看Lambda日志,但我看不到实际的错误或代码崩溃的堆栈跟踪。当我查看日志时,我只能看到以下输出。

START RequestId: 62341bgd-6231-11e8-8c5b-25793532a32u Version: $LATEST
END RequestId: 62341b0d-6231-1128-8r5b-2b793032a3ed
REPORT RequestId: 6234te0b-6rte-aaa8-au5a-21t93132r3rt  Duration: 0.46 ms

如何查看Python API的实际堆栈跟踪以进行调试?


你有没有进行任何“日志记录”操作?哪个应用程序正在执行“看门狗”任务?无法。 - dsgdfg
https://docs.aws.amazon.com/lambda/latest/dg/python-logging.html - OneCricketeer
6个回答

3

Lambda总是尝试将Python堆栈跟踪写入CloudWatch。确保您的函数具有所需的权限:

    {
        "Effect": "Allow",
        "Action": [
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Resource": "arn:aws:logs:eu-west-1:123456789012:*"
    },
    {
        "Effect": "Allow",
        "Action": "logs:CreateLogGroup",
        "Resource": "*"
    }

2
如果您正在使用Lambda_basic_execution角色,则在Python中进行简单的打印操作将会在CloudWatch中显示日志。

1
这绝对可以使用print语句来实现,但是为什么log.info等方式不能以同样的方式工作呢? - Steve
我看到这是一个有点老的帖子。但是我在使用Python 3.9时遇到了相同的问题,所以在这里留下了评论。当使用Lambda时,您必须使用logger.setLevel(logging.INFO)。它不能与logging.basicConfig(level = logging.INFO)一起使用。 - hlesnt395

1
我的日志已启用,但仍未打印任何内容,也未在CloudWatch中显示添加的日志。但是当我注释掉一个尝试从dynamo db打印太多数据的打印语句时,它又开始工作了,所以也许在代码的其他地方你使用了打印来打印大量数据,因此请禁用它。
你不能打印太多数据,否则它既不会在测试中打印任何内容,也不会在CloudWatch中添加日志。

0

初步调查:

默认情况下,Lambda函数会在CloudWatch中创建一个名为我的API的日志组。例如,/aws/lambda/my_api_name,它显示的输出类似于以下内容。

START RequestId: 62341bgd-6231-11e8-8c5b-25793532a32u Version: $LATEST
END RequestId: 62341b0d-6231-1128-8r5b-2b793032a3ed
REPORT RequestId: 6234te0b-6rte-aaa8-au5a-21t93132r3rt  Duration: 0.46 ms
问题解决:

我为我的CloudWatch创建了一个服务角色(AWS已经提供了所有CloudWatch权限的默认策略),然后将此角色放入我的API中。我遵循了这个方法。但是,另一步可能是将新创建的执行日志与默认日志组合在一起,这样我们就可以拥有一个日志组来跟踪。


0

我看到这是一个有点老的问题。但是我在使用Python 3.9时遇到了同样的问题,所以在这里留下评论,这就是我解决问题的方法。当使用Lambda时,请使用:

logger = logging.getLogger()
logger.setLevel(logging.INFO)

使用它时它不起作用:

logger = logging.getLogger()
logging.basicConfig(level=logging.INFO)


0
如果您的日志记录不需要定制化,您可以使用内置的日志记录器。这种方法可以让您每次都将消息记录到CloudWatch中。
def lambda_handler(event, context):
    ...
    context.log("Hello world")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接