Amazon AWS Elastic Beanstalk EBS регистрирует в Cloudwatch (мульти докер Env)
Я хотел бы просмотреть все мои журналы в cloudwatch. В настоящее время у меня есть многопрофильная среда Elastic beanstalk.
Я выбрал журналы для отправки в cloudwatch, перейдя в
Elastic Beanstalk > App > Env > Configuration > Software Configuration > CloudWatch Logs
Это включено.
Когда я смотрю в cloudwatch, я вижу следующие биты..
/aws/elasticbeanstalk/myapp-staging/var/log/docker-events.log
/aws/elasticbeanstalk/myapp-staging/var/log/eb-activity.log
/aws/elasticbeanstalk/myapp-staging/var/log/eb-ecs-mgr.log
/aws/elasticbeanstalk/myapp-staging/var/log/ecs/ecs-agent.log
/aws/elasticbeanstalk/myapp-staging/var/log/ecs/ecs-init.log
Но я не вижу журналы доступа / ошибок nginx.
У меня есть это в моем Dockerrun.aws.json
"mountPoints":[
{
"sourceVolume": "awseb-logs-nginx",
"containerPath": "/var/log/nginx"
}
Если я использую SSH для экземпляра с этим содержимым, я вижу, что эти журналы (когда я нажимаю URLS) генерируются (как и ожидалось) по локальному пути /var/log/containers/nginx/access.log
и т.п.
Кроме того, если я захожу в EBS > Журналы и запрашиваю последние журналы, я также вижу их, что находится в журнале доступа, он просто не отправляется в CloudWatch?
Я задавался вопросом, должен ли я был настроить Log Group
с правильным путем, я попробовал это, но это не заполнилось?
Я уверен, что мне чего-то не хватает, чтобы передать это в Cloudwatch, большое спасибо заранее!
Обновление: с тех пор я добавил ниже, который был предложен как то, что требуется. Этот файл находится в .ebextensions
папка с именем nginx_logs.conf
,
packages:
yum:
awslogs: []
files:
"/etc/awslogs/config/nginx_logs.conf" :
mode: "000600"
owner: root
group: root
content: |
[/var/log/containers/nginx/access.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/containers/nginx/access.log"]]}`
log_stream_name = {instance_id}
file = /var/log/containers/nginx/access.log*
[/var/log//containers/nginx/error.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/containers/nginx/error.log"]]}`
log_stream_name = {instance_id}
file = /var/log/containers/nginx/error.log*
commands:
"01":
command: chkconfig awslogs on
"02":
command: service awslogs restart
Все еще нет радости, так как я снова вижу их, когда нажимаю на журналы запросов или запрашиваю последние 100 журналов. Но ничего в облачном часе...
2 ответа
Согласно официальной документации AWS, для среды Docker Multicontainer EB собраны следующие файлы:
- /var/log/eb-activity.log
- /var/log/ecs/ecs-init.log
- /var/log/eb-ecs-mgr.log
- /var/log/ecs/ecs-agent.log
- /var/log/docker-events.log
Поскольку эти пути не включают каталог, содержащий журналы nginx, имеет смысл, что они не будут передаваться в CloudWatch.
Для потоковой передачи ваших журналов, похоже, вам нужно будет настроить агент журналов CloudWatch для сбора файлов в каталоге контейнеров. Здесь приведены примеры конфигураций. Честно говоря, немного странно, что конфигурация по умолчанию для Docker Multicontainer не включает журналы контейнеров, но, очевидно, именно так AWS реализовал это.
Мы используем следующие расширения для потоковой передачи журналов приложений (nginx/ror) в cloudwatch
$ cat .ebextensions/cw-logs.config
files:
"/etc/awslogs/config/nginx-access-log.conf":
mode: "000644"
owner: root
group: root
encoding: plain
content: |
[nginx-access.log]
datetime_format = %Y-%m-%dT%H:%M:%S%f
file = /var/log/containers/project1-staging/nginx_access.log
buffer_duration = 5000
log_stream_name = project1_staging_{instance_id}
initial_position = start_of_file
log_group_name = PROJECT1_STAGING_NGINX
"/etc/awslogs/config/app-log.conf":
mode: "000644"
owner: root
group: root
encoding: plain
content: |
[app-access.log]
datetime_format = %Y-%m-%dT%H:%M:%S
file = /var/log/containers/project1-staging/app.log
buffer_duration = 5000
log_stream_name = project1_staging_{instance_id}
initial_position = start_of_file
log_group_name = PROJECT1_STAGING_APP
commands:
00-cmd:
command: chkconfig --level 35 awslogs on
test: "[ -s /usr/sbin/awslogsd ]"
container_commands:
00-cmd:
command: service awslogs restart
test: "[ -s /etc/awslogs/config/nginx-access-log.conf -a -s /etc/awslogs/config/app-log.conf ]"
И ротация к политике S3
$ cat .ebextensions/cw-logs-s3-rotation.config
files:
"/tmp/logrotate-project1-staging.conf":
mode: "000644"
owner: root
group: root
encoding: plain
content: |
/var/log/containers/project1-staging/*.log {
size 512M
weekly
rotate 0
missingok
compress
notifempty
copytruncate
dateext
dateformat -%Y-%m-%d_%s
olddir /var/log/containers/project1-staging/rotated
lastaction
aws s3 mv --recursive /var/log/containers/project1-staging/rotated/ \
s3://app-logs-archive-s3-bucket/project1-staging/$(date '+%Y')/
endscript
}
container_commands:
00-cmd:
command: mv /tmp/logrotate-project1-staging.conf /etc/logrotate.elasticbeanstalk.hourly/logrotate.elasticbeanstalk.applogs-project1-staging.conf
test: "[ -f /tmp/logrotate-project1-staging.conf ]"
Наш Dockerrun.aws.json выглядит так
$ cat Dockerrun.aws.json
{
"AWSEBDockerrunVersion": 2,
"containerDefinitions": [{
"name": "project1-staging",
"image": "0123456789.dkr.ecr.us-east-1.amazonaws.com/project1:staging_v.1234567",
"cpu": {{ env['DOCKER_CPU'] }},
"memory": {{ env['DOCKER_MEMORY'] }},
"essential": true,
"portMappings": [{
"hostPort": 80,
"containerPort": 80
},
{
"hostPort": 443,
"containerPort": 443
}],
"mountPoints": [{
"sourceVolume": "awseb-logs-project1-staging",
"containerPath": "/home/app/project1/log"
}]
}]
}