当我 运行 我的 Node.Js 应用程序图像使用 AWS ECS 时如何访问 PM2 日志
How to access PM2 logs when I run my Node.Js app image using AWS ECS
我的 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
进行一些更改,以便将日志推送到标准输出。
CMD ["pm2-runtime", "app.js"]
#OR
CMD ["pm2-runtime", "process.yml"]
pm2-runtime
专为 docker 容器设计,它与 pm2
.
捆绑在一起
通过这样做,如果在任务定义中配置,您将能够访问容器外的日志,也可以在云监视中访问。
你需要在任务定义中添加这个
"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
这是在容器中处理日志的标准方法。
装载日志文件夹
不推荐在生产系统中使用另一个选项,
- 在pm2配置文件中设置日志路径,假设设置为
/app/logs/myapp.log
- 将主机路径 /home/ec2-user/container-logs 映射到 /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"
}
]
}
]
我的 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
进行一些更改,以便将日志推送到标准输出。
CMD ["pm2-runtime", "app.js"]
#OR
CMD ["pm2-runtime", "process.yml"]
pm2-runtime
专为 docker 容器设计,它与 pm2
.
通过这样做,如果在任务定义中配置,您将能够访问容器外的日志,也可以在云监视中访问。
你需要在任务定义中添加这个
"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
这是在容器中处理日志的标准方法。
装载日志文件夹
不推荐在生产系统中使用另一个选项,
- 在pm2配置文件中设置日志路径,假设设置为
/app/logs/myapp.log
- 将主机路径 /home/ec2-user/container-logs 映射到 /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"
}
]
}
]