如何在使用AWS ECS运行Node.Js应用程序映像时访问PM2日志

如何在使用AWS ECS运行Node.Js应用程序映像时访问PM2日志,node.js,amazon-web-services,amazon-ecs,pm2,Node.js,Amazon Web Services,Amazon Ecs,Pm2,My node.js应用程序通过AWS ECS运行。要启动它,我通过任务定义使用Docker映像,其中包含以下命令来启动我的应用程序: pm2,ecosystem.config.js 该应用程序启动良好,但我找不到PM2日志 当我试图在ECS服务正在通过的EC2实例上直接访问它时 /home/ec2-user/.pm2/logs/my-log.log 当然,当我直接在那个实例上启动我的应用程序时,那里只有旧的日志文件——这是有道理的,因为如果PM2在Docker容器中运行,它也会将日志文件保

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

pm2,ecosystem.config.js
该应用程序启动良好,但我找不到PM2日志

当我试图在ECS服务正在通过的EC2实例上直接访问它时

/home/ec2-user/.pm2/logs/my-log.log
当然,当我直接在那个实例上启动我的应用程序时,那里只有旧的日志文件——这是有道理的,因为如果PM2在Docker容器中运行,它也会将日志文件保存在那里


那么,是否有一种方法可以启动我的实例,使我能够访问PM2日志文件,或者至少可以将它们保存在实例的特定文件夹中?

您有两种方法可以访问容器中的流程日志

  • 将日志推送到容器的stdout/stderr,并在Cloudwatch中获取容器的日志(在fargate的情况下很有用),还基于12个因素应用程序
  • 装载具有容器日志路径的主机文件夹
在第一个选项中,您需要对Dockerfile
CMD
进行一些更改,以便将日志推送到stdout

CMD ["pm2-runtime", "app.js"]
#OR
CMD ["pm2-runtime", "process.yml"]
pm2运行时
是为docker容器设计的,它与
pm2
捆绑在一起

通过这样做,您将能够访问容器外部的日志,如果在任务定义中进行了配置,还可以访问cloud watch中的日志

您需要将其添加到任务定义中

"logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "awslogs-pm2",
                    "awslogs-region": "us-west-2",
                    "awslogs-stream-prefix": "awslogs-nodejs"
                }
            }
访问并查找awslogs-pm2

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

装载日志文件夹

这是生产系统中不推荐的另一个选项

  • 在pm2配置文件中设置日志路径,假设它设置为
    /app/logs/myapp.log
  • 将主机路径/home/ec2用户/容器日志映射为/app/logs/myapp.log
然后您将能够在主机上的
/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"
        }
      ]
    }
  ]

哇,这是一个非常好的答案。非常感谢你!