Go开发AWS Lambda函数无日志输出问题求助
先查Lambda执行角色的权限
必须确保你的Lambda执行角色拥有logs:CreateLogGroup、logs:CreateLogStream、logs:PutLogEvents这三个CloudWatch Logs相关权限。默认的Lambda基础执行角色自带这些权限,但如果是自定义角色,很可能漏加了——没权限的话,函数根本没法把日志写到CloudWatch,自然看不到日志流。确认log.Print的输出路径没被改
Go的log.Print默认输出到stdout/stderr,Lambda会自动捕获这两个流的内容。要是你自定义了log的输出目标(比如写到本地文件),Lambda就抓不到日志了。另外还要确认代码里的log.Print确实被执行到了——比如有没有提前return跳过了日志代码分支。检查函数是否真的被触发执行
去Lambda控制台的「监控」标签页看调用次数,如果次数是0,说明测试根本没触发函数。比如测试事件格式错了导致函数初始化失败,或者执行超时被强制终止,这种情况不会生成日志流。直接去CloudWatch Logs控制台找日志组
Lambda对应的日志组命名是/aws/lambda/[你的函数名],直接搜这个日志组:如果不存在,说明函数连日志组都创建不了,基本是权限问题;如果存在但没日志流,那要查函数执行时的错误。验证部署包是否正确
Go的Lambda函数必须编译成Linux环境的二进制文件,而且部署包根目录要有可执行文件(blank-go示例里默认是bootstrap)。编译命令用GOOS=linux GOARCH=amd64 go build -o bootstrap main.go,打包的时候别把二进制文件放到子目录里,不然Lambda找不到执行文件,启动失败自然没日志。看测试页面的执行结果错误详情
在测试页面的「执行结果」里,有没有初始化错误或者运行时错误?比如函数panic了没被捕获,可能日志还没发出去就被终止,这时候CloudWatch没日志流,但执行结果里会有错误提示。
内容的提问来源于stack exchange,提问作者xpt

