【问题标题】:How to access PM2 logs when I run my Node.Js app image using AWS ECS使用 AWS ECS 运行 Node.Js 应用程序映像时如何访问 PM2 日志
【发布时间】:2020-07-10 00:03:34
【问题描述】:

我的 node.js 应用程序通过 AWS ECS 运行。为了启动它,我通过任务定义使用 Docker 映像,其中包含以下命令来启动我的应用程序:

pm2,ecosystem.config.js

应用程序启动正常,但是我找不到 PM2 日志。

当我尝试在运行 ECS 服务的 EC2 实例上直接访问它时

/home/ec2-user/.pm2/logs/my-log.log

当然,当我直接在该实例上启动我的应用程序时,只有旧的日志文件存在 — 这是有道理的,因为如果 PM2 在 Docker 容器中运行,它也会将日志文件保存在那里。

那么有没有办法以我可以访问 PM2 日志文件的方式启动我的实例,或者至少我可以将它们保存在实例上的特定文件夹中?

【问题讨论】:

    标签: node.js amazon-web-services amazon-ecs pm2


    【解决方案1】:

    您有两个选项可以访问容器内的进程日志。

    • 将日志推送到容器的 stdout/stderr 并在 Cloudwatch 中获取容器的日志(在 Fargate 的情况下很有用),并且还基于 12 因素应用程序。
    • 使用容器日志路径装载 Host 文件夹

    在第一个选项中,您需要对 Dockerfile CMD 进行一些更改,以便将日志推送到标准输出。

    CMD ["pm2-runtime", "app.js"]
    #OR
    CMD ["pm2-runtime", "process.yml"]
    

    pm2-runtime 是为 docker 容器设计的,它与pm2 捆绑在一起。

    What's the difference between pm2 and pm2-runtime?

    通过这样做,如果在任务定义中进行了配置,您也可以在云监控中访问容器外部的日志。

    你需要在任务定义中添加这个

    "logConfiguration": {
                    "logDriver": "awslogs",
                    "options": {
                        "awslogs-group": "awslogs-pm2",
                        "awslogs-region": "us-west-2",
                        "awslogs-stream-prefix": "awslogs-nodejs"
                    }
                }
    

    访问 https://console.aws.amazon.com/cloudwatch/ 并查找 awslogs-pm2

    using_awslogs

    这是在容器中处理日志的标准方法。

    装载日志文件夹

    不建议在生产系统中使用此选项,

    • 在pm2配置文件中设置日志路径,假设设置为/app/logs/myapp.log
    • 使用 /app/logs/myapp.log 映射主机路径 /home/ec2-user/container-logs

    然后您将能够在/app/logs/myapp.log 下的主机上找到容器 process.yml

    apps:
      - script : myapp.js
        name   : 'api-server'
        error_file : './logs/myapperror.log'
        out_file : './logs/myappoutput.log'
    

    挂载配置

      "containerDefinitions": [
        {
          "name": "database1",
          "image": "my-repo/database",
          "cpu": 100,
          "memory": 100,
          "essential": true,
          "mountPoints": [
            {
              "sourceVolume": "database_scratch",
              "containerPath": "/var/scratch"
            }
          ]
        },
        {
          "name": "database2",
          "image": "my-repo/database",
          "cpu": 100,
          "memory": 100,
          "essential": true,
          "mountPoints": [
            {
              "sourceVolume": "database_scratch",
              "containerPath": "/var/scratch"
            }
          ]
        }
      ]
    

    ECS bind-mounts

    【讨论】:

    • 哇,这是一个非常好的答案。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2017-04-19
    • 2016-12-10
    • 2018-12-20
    • 1970-01-01
    • 2018-09-22
    • 2018-06-03
    相关资源
    最近更新 更多