猿问

如何查看正在运行的 Fargate ECS 任务的 Python 打印语句?

我有一个 Fargate ECS 容器,用于通过 ECS 中的任务运行 Docker 容器。当任务启动时,会调用一个sh脚本runner.sh,,


#!/bin/sh

echo "this line will get logged to ECS..."

python3 src/my_python_script.py # however print statements from this Python script are not logged to ECS

这又会启动一个长时间运行的 Python 脚本my_python_script.py. 我知道 Python 脚本运行良好,因为它执行了需要执行的操作,但我看不到 Python 脚本的输出。


里面my_python_script.py有好几条print()语句。在我的 ECS Fargate 任务的 CloudWatch 日志中,我看到 sh 脚本 ( "this line will get logged to ECS...") 的输出,但没有看到print()Python 脚本中执行的语句的输出。


这是我的任务定义中的日志配置:


{

    "ipcMode": null,

    "executionRoleArn": "myecsTaskExecutionRolearn",

    "containerDefinitions": [

        {

            "dnsSearchDomains": null,

            "environmentFiles": null,

            "logConfiguration": {

                "logDriver": "awslogs",

                "secretOptions": null,

                "options": {

                    "awslogs-group": "/ecs/mylogsgroup",

                    "awslogs-region": "eu-west-1",

                    "awslogs-stream-prefix": "ecs"

                }

            },

            "entryPoint": null,

            "portMappings": [],

            "command": null,

            "linuxParameters": null,

            "cpu": 0,

            "environment": [],

            "resourceRequirements": null,

            "ulimits": null,

            "dnsServers": null,

            "mountPoints": [],

            "workingDirectory": null,

            "secrets": null,

            "dockerSecurityOptions": null,

            "memory": null,

            "memoryReservation": null,

            "volumesFrom": [],

            "stopTimeout": null,

            "image": "1234567.dck.aws.com/mydockerimage",

            "startTimeout": null,

            "firelensConfiguration": null,

        }

 

我想我正在遵循https://docs.aws.amazon.com/AmazonECS/latest/userguide/using_awslogs.html中的 awslogs 说明,但也许不是?我是否需要做一些明显的事情来确保print()在我的 ECS 任务的 CloudWatch 日志中捕获 Python 脚本中的语句?


ibeautiful
浏览 90回答 1
1回答

慕丝7291255

在我看来,您可以在这里处理一些事情。第一个是 Python 的默认缓冲行为,这可能会阻止输出显示。你需要阻止这个。您可以通过在 CMD 之前插入以下内容来正确设置PYTHONUNBUFFERED环境变量:ENV PYTHONUNBUFFERED=1其次,任务中的容器记录的信息类型主要取决于它们的 ENTRYPOINT 命令。默认情况下,捕获的日志显示您在本地运行容器时通常会在交互式终端中看到的命令输出,即 STDOUT 和 STDERR I/O 流。awslogs 日志驱动程序只是将这些日志从 Docker 传递到 CloudWatch Logs。有关如何处理 Docker 日志的更多信息,包括捕获不同文件数据或流的替代方法,请参阅 Docker 文档中的查看容器或服务的日志。因此,按照ENTRYPOINT 的 Exec 形式,我将用以下内容替换 CMD 行:ENTRYPOINT ["/app/runner.sh"]这应该有助于将您的 shell 脚本的 STDOUT 和 STDERR I/O 流连接起来,并希望将您的 Python 脚本连接到容器日志记录。
随时随地看视频慕课网APP

相关分类

Python
我要回答