今天,我们将隆重介绍一款新的docker日志收集工具:log-pilot Github项目地址:https://github.com/AliyunContainerService/log-pilot 你可以在每台机器上部署一个log-pilot实例,就可以收集机器上所有Docker应用日志。log-pilot具有如下特性
下面我们先演示一个最简单的场景:我们先启动一个log-pilot,再启动一个tomcat容器,让log-pilot收集tomcat的日志。为了简单起见,这里先不涉及sls或者elk,如果你想在本地玩玩,只需要有一台运行docker的机器就可以了。
首先启动log-pilot。要注意的是,以这种方式启动,由于没有配置后端使用的日志存储,所有收集到的日志都会直接输出到控制台,所以主要用于调试。
打开终端,输入命令:
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /:/host \
--privileged \
registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.1
你会看到log-pilot启动的日志。别关终端。新开一个终端启动tomcat。tomcat镜像属于少数同时使用了stdout和文件日志的docker镜像,非常适合这里的演示。
docker run -it --rm -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
先解释下这里的配置。aliyun.logs.catalina=stdout
告诉log-pilot这个容器要收集stdout日志,aliyun.logs.access=/usr/local/tomcat/logs/localhost_access_log.*.txt
则表示要收集容器内/usr/local/tomcat/logs/
目录下所有名字匹配localhost_access_log.*.txt
的文件日志。后面会详细介绍label的用法。
如果你在本地部署tomcat,而不是在阿里云容器服务上,-v /usr/local/tomcat/logs
也需要,否则log-pilot没法读取到日志文件。容器服务自动做了优化,不需自己加-v
了。
log-pilot会监控Docker容器事件,发现带有aliyun.logs.xxx
容器的时候,自动解析容器配置,并且开始收集对应的日志。启动tomcat之后,你会发现log-pilot的终端立即输出了一大堆的内容,其中包含tomcat启动时输出的stdout日志,也包括log-pilot自己输出的一些调试信息。
你可以打开浏览器访问刚刚部署的tomcat,你会发现每次刷新浏览器,在log-pilot的终端里都能看到类似如下的记录。其中message
后面的内容就是从/usr/local/tomcat/logs/localhost_access_log.XXX.txt
里收集到的日志。
首先我们要部署一套Elastichsearch+Kibana,前面的文章里介绍过如何在阿里云容器服务里部署ELK,你可以参照文章在容器服务上直接部署,或者按照Elasticsearch/Kibana的文档直接在机器上部署,这里不再赘述。假设已经部署好了这两个组件。
如果你还在运行刚才启动的log-pilot
,先关掉,使用下面的命令启动,执行之前,注意先把ELASTICSEARCH_HOST
和ELASTICSEARCH_PORT
两个变量替换成你实际使用的值。ELASTICSEARCH_PORT
一般是9200
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /:/host \
-e FLUENTD_OUTPUT=elasticsearch \
-e ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST} \
-e ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT} \
--privileged \
registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.1
相比前面启动log-pilot
的方式,这里增加了三个环境变量:
FLUENTD_OUTPUT=elasticsearch
: 把日志发送到elasticsearchELASTICSEARCH_HOST=${ELASTICSEARCH_HOST}
: elasticsearch的域名ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT}
: elasticsearch的端口号继续运行前面的tomcat,再次访问,让tomcat产生一些日志,所有这些新产生的日志都讲发送到elasticsearch里。打开kibana,这时候你应该还看不到新日志,需要先创建index。log-pilot会把日志写到elasticsearch特定的index下,规则如下
1. 如果应用上使用了标签aliyun.logs.tags,并且tags里包含target,使用target作为elasticsearch里的index,否则
2. 使用标签aliyun.logs.XXX里的XXX作为index
在前面tomcat里的例子里,没有使用aliyun.logs.tags
标签,所以默认使用了access
和catalina
作为index。我们先创建index access
创建好index就可以查看日志了。
容器服务是最适合log-pilot运行的地方,专门为log-pilot做了优化。要在容器服务里运行log-pilot,你需要做的仅仅是使用下面的编排文件创建一个新应用。
pilot:
image: registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.1
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /:/host
privileged: true
environment:
FLUENTD_OUTPUT: elasticsearch #按照你的需要替换
ELASTICSEARCH_HOST: ${elasticsearch} #按照你的需要替换
ELASTICSEARCH_PORT: 9200
labels:
aliyun.global: true
接下来,你就可以在要收集日志的应用上使用aliyun.logs.xxx
标签了。
启动tomcat的时候,我们声明了这样下面两个,告诉log-pilot
这个容器的日志位置。
--label aliyun.logs.catalina=stdout
--label aliyun.logs.access=/usr/local/tomcat/logs/localhost_access_log.*.txt
你还可以在应用容器上添加更多的标签
aliyun.logs.$name = $path
0-9a-zA-Z_
和-
/var/log/he.log
和/var/log/*.log
都是正确的值,但/var/log
不行,不能只写到目录。stdout
是一个特殊值,表示标准输出aliyun.logs.$name.format
,日志格式,目前支持
aliyun.logs.$name.tags
: 上报日志的时候,额外增加的字段,格式为k1=v1,k2=v2
,每个key-value之间使用逗号分隔,例如
aliyun.logs.access.tags="name=hello,stage=test"
,上报到存储的日志里就会出现name字段和stage字段对于大部分用户来说,log-pilot
现有功能足以满足需求,如果遇到没法满足的场景怎么办?
地址