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