log-pilot能够通过配置一定的规则收集单台部署机器的所有容器日志,是一款来自阿里云的类似filebeat的轻量级容器日志收集工具。

log-pilot具有如下特性

  • 一个单独log进程,收集机器上所有容器的日志。不需要为每个容器启动一个log进程
  • 支持文件日志和stdout。docker log dirver亦或logspout只能处理stdout,log-pilot不光支持收集stdout日志,还可以收集文件日志。
  • 声明式配置。当你的容器有日志要收集,只要通过label声明要收集的日志文件的路径,无需改动其他任何配置,log-pilot就会自动收集新容器的日志。
  • 支持多种日志存储方式。无论是强大的阿里云日志服务,还是比较流行的elasticsearch组合,甚至是graylog,log-pilot都能把日志投递到正确的地点。
  • log-pilot完全开源,github
  • 支持fluentd和filebeat各类插件

1. 启动log-pilot

使用docker启动log-pilot

1
2
3
4
5
6
7
8
9
10
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/localtime:/etc/localtime \
-v /:/host:ro \
-e PILOT_TYPE=filebeat \
-e LOGGING_OUTPUT=logstash \
-e LOGSTASH_HOST=${LOGSTASH_HOST} \
-e LOGSTASH_PORT=${LOGSTASH_PORT} \
--privileged \
registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.1

参数解析:

  • –privileged: 容器内的root拥有真正的root权限(默认是外部的一个普通用户)
  • LOGGING_OUTPUT=logstash: 把日志发送到logstash
  • LOGSTASH_HOST=${LOGSTASH_HOST}: logstash的域名
  • LOGSTASH_PORT=${LOGSTASH_PORT}: logstash的端口号

也可以直接跳过logstash,将日志输出到elasticsearch,配置详情见log-pilot-docs

2. 启动elasticsearch

设置/etc/sysctl.conf

1
vm.max_map_count=262144
1
2
3
4
5
6
docker run -d \
--name elasticsearch \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
elasticsearch:6.5.4

3. 启动logstash

默认的配置文件可以先从logstash测试容器中拷出到/opt/logstash/pipeline/

1
2
3
4
5
docker run -d \
-v /opt/logstash/pipeline/:/usr/share/logstash/pipeline/ \
-p 5000:5000 \
-p 5044:5044 \
logstash:6.5.4

其中/opt/logstash/pipeline/pipelines.yml

1
2
- pipeline.id: main
path.config: "/usr/share/logstash/pipeline/conf.d/*.conf"

/opt/logstash/pipeline/conf.d/elasticsearch.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
input {
beats {
port => 5044
type => beats
}
tcp {
port => 5000
type => syslog
}
}
filter {
}
output {
elasticsearch {
hosts => ["elasticsearch01:9200", "elasticsearch02:9200"]
}
stdout { codec => rubydebug }
}

4. 收集日志

当服务以docker容器方式启动时,需要指定label来让log-pilot自动触发收集,以下以tomcat为例:

1
2
3
4
5
6
docker run -d \
-p 10080:8080 \
-v /usr/local/tomcat/logs \
--label aliyun.logs.catalina=stdout \
--label aliyun.logs.access=/usr/local/tomcat/logs/localhost_access_log.*.txt \
tomcat

启动tomcat的时候,我们声明了这样下面两个,告诉log-pilot这个容器的日志位置,还可以在应用容器上添加更多的标签

aliyun.logs.$name = $path

变量name是日志名称,具体指随便是什么,你高兴就好。只能包含0-9a-zA-Z_和-
变量path是要收集的日志路径,必须具体到文件,不能只写目录。文件名部分可以使用通配符。/var/log/he.log和/var/log/*.log都是正确的值,但/var/log不行,不能只写到目录。stdout是一个特殊值,表示标准输出

aliyun.logs.$name.format:日志格式,目前支持

  • none 无格式纯文本
  • json: json格式,每行一个完整的json字符串
  • csv: csv格式

aliyun.logs.$name.tags: 上报日志的时候,额外增加的字段,格式为k1=v1,k2=v2,每个key-value之间使用逗号分隔,例如

aliyun.logs.access.tags=“name=hello,stage=test”,上报到存储的日志里就会出现name字段和stage字段
如果使用elasticsearch作为日志存储,target这个tag具有特殊含义,表示elasticsearch里对应的index

5. 索引日志

产生的日志都讲发送到elasticsearch里。打开kibana,这时候你应该还看不到新日志,需要先创建index。log-pilot会把日志写到elasticsearch特定的index下,规则如下

1
2
1. 如果应用上使用了标签aliyun.logs.tags,并且tags里包含target,使用target作为elasticsearch里的index,否则
2. 使用标签aliyun.logs.XXX里的XXX作为index