- 原因
现所有 EB 环境服务的 log,均以文件的形式,存储在 EB 机器本地。当机器因各种问题(包含但不限于 bug ),造成无法远程访问时,无法读取其上的 log 来定位问题。故引入 AWS 的 CloudWatch Log 服务。
原理
CloudWatch Log 是一项服务。功能是,以接近实时的速度以流的方式读取、并存储文件。配置
- 在项目根目录下创建名为
.ebextentions
的目录; - 在
.ebextentions
中新建文件default.config
,扩展名必须为.config
,文件名任意,合法即可; - 写入如下内容,部署时自动执行,具体见AWS文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46packages:
yum:
awslogs: []
files:
"/etc/awslogs/awscli.conf" :
mode: "000600"
owner: root
group: root
content: |
[plugins]
cwlogs = cwlogs
[default]
region = `{"Ref":"AWS::Region"}`
"/etc/awslogs/awslogs.conf" :
mode: "000600"
owner: root
group: root
content: |
[general]
state_file = /var/lib/awslogs/agent-state
"/etc/awslogs/config/logs.conf" :
mode: "000600"
owner: root
group: root
content: |
[/var/log/automation/app.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/automation/app.log"]]}`
log_stream_name = {instance_id}
file = /var/log/automation/app.log
commands:
"1_init_log_dir":
cwd: /var/log/
command: |
mkdir automation
chmod 775 automation
chgrp wsgi automation
chown wsgi automation
ignoreErrors: true
"2_check_awslogs":
command: chkconfig awslogs on
"3_reload_awslogs":
command: service awslogs restart
- 说明
配置文件中使用了 3 个键,packages、files 和 commands。具体说明可见AWS文档。
- packages
- 使用 yum 安装 CloudWatch Log 服务,awslogs。
- files:写入 awslogs 的配置文件,其中前两个 awscli.conf 和 awslogs.conf 在此不需要关心,只需关注第 3 个 logs.conf。
- log_group_name: 在 CloudWatch Log 中显示的 group 的名称,对应下图中红色框;
- log_stream_name: 在 CloudWatch Log 中显示的 stream 的名称,对应下图中蓝色框;
- file: 该数据流所关联的文件的绝对路径
- commands
为便于查看和管理,统一将log放到了路径/var/log/
下,并每个独立程序使用一个目录,这里使用automation说明。在 2 中,参数 file 使用的值是/var/log/automation/app.log
,所以在启动前需先创建 automation 目录。
1_init_log_dir: 创建目录并修改权限,EB环境中,程序的默认执行用户是 wsgi;
2_check_awslogs: 更新 awslogs 服务;
3_reload_awslogs: 重启 awslogs 服务。
使用
将配置文件 default.config 中 logs.conf 的 log_group_name、log_stream_name和file以及 1_init_log_dir 替换为对应项目信息即可,在 CloudWatch Log 中可根据 group_name 和 stream_name 查找 log。扩展
如有需要,可同时创建多个流,修改 logs.conf 即可,格式参考如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19"/etc/awslogs/config/logs.conf" :
mode: "000600"
owner: root
group: root
content: |
[/var/log/messages]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/messages"]]}`
log_stream_name = {instance_id}
file = /var/log/messages
[/var/log/dmesg]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/dmesg"]]}`
log_stream_name = {instance_id}
file = /var/log/dmesg
[/var/log/automation/app.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/automation/app.log"]]}`
log_stream_name = {instance_id}
file = /var/log/automation/app.log