前言
通常在使用容器部署应用,特别是借助Kubernetes
云平台管理及部署应用时,需要收集各个应用的控制台标准输出及日志文件,统一输出到Elasticsearch
,并由Kibana
进行可视化展示。
其中一个方案是使用log-pilot
进行容器日志收集,并输出到Elasticsearch
。log-pilot
是由阿里云提供,但是从其GitHub代码仓库的提交记录可以看出,目前已经处于停止维护的状态,其支持的Elasticsearch
版本也只到6.x
,对于较新的版本7.x
,从实验结果看是不支持的。
所以本文将使用Elasticsearch
的6.8.18
版本进行安装实验,关于Elasticsearch
的安装步骤,请参考另一篇博文。
下载镜像
docker pull registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.5-filebeat
创建log-pilot容器
docker run -it --name log-pilot \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /:/host \
--privileged \
-e PILOT_LOG_PREFIX=test \
-e FLUENTD_OUTPUT=elasticsearch \
-e LOGGING_OUTPUT=elasticsearch \
-e ELASTICSEARCH_HOSTS=192.168.3.201:9200 \
registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.5-filebeat
我们注意到,这里配置了三个环境变量,说明如下:
-
PILOT_LOG_PREFIX=test
设置日志配置的前缀,将在后面测试容器创建时使用 -
FLUENTD_OUTPUT=elasticsearch
把日志发送到Elasticsearch -
ELASTICSEARCH_HOSTS=192.168.3.201:9200
Elasticsearch的地址及端口号
可以看到容器输出日志:
enable pilot: filebeat
DEBU[0000] 05cc29a5c788593d72a28cb6ac9c28137014c5843888df1bac0fa49e4d0dae07 has not log config, skip
INFO[0000] starting filebeat
INFO[0000] filebeat started: 21
INFO[0000] filebeat watcher start
INFO[0000] Reload gorouting is ready
创建测试容器
我们分别创建Tomcat
和Nginx
容器,来测试log-pilot
分别对标准输出及日志文件的收集。
Tomcat容器
docker run -it --name tomcat --rm -p 18080:8080 \
-v /usr/local/tomcat/logs \
--label test.logs.tomcat_catalina=stdout \
--label test.logs.tomcat_access=/usr/local/tomcat/logs/localhost_access_log.*.txt \
tomcat
注意这里的--label
参数分别配置了test.logs.tomcat_catalina
、test.logs.tomcat_access
,其中的test就是上文通过PILOT_LOG_PREFIX
环境变量指定的值。stdout
是特殊值,表示标准输出,test.logs.tomcat_catalina
这个配置表示将收集容器的标准输出。另一个test.logs.tomcat_access
配置将收集容器对应路径下的日志文件。
接下来通过浏览器访问http://192.168.3.201:18080/
地址,虽然我们会看到404错误,但是我们会看到容器里的localhost_access_log.txt文件将输出响应的信息。log-pilot
将收集这个文件的内容,并输出到Elasticsearch
。
创建index pattern
访问Kibana
页面,在Management
-Index Patterns
菜单中可以看到,已经看到了我们配置的Index。
在Index pattern中填写tomcat_access*
,并点击下一步。
选择@timestamp域,完成index pattern的创建。
查看Discover
菜单,并选择我们创建的tomcat_access*
过滤器,可以看到Tomcat的访问日志。
Nginx容器
docker run --name nginx --rm -p 80:80 \
-v /var/log/nginx \
--label test.logs.nginx=stdout \
docker.io/nginx:1.21.3
同样的,这里配置--label test.logs.nginx=stdout
来收集nginx的控制台输出。
访问http://192.168.3.201/
,可以看到容器后台输出了类似的日志内容:
在log-pilot
的后台也输出了收集到的日志:
接着我们在Kibana上创建nginx的index pattern
,使用nginx*作为条件。
回到Discover
菜单,将过滤条件切换为nginx*,将看到nginx的控制台日志输出。
总结
至此,通过log-pilot
进行容器控制台及日志文件的内容收集,并输出到Elasticsearch
的实验就结束了,特别需要说明的是,docker的版本在开始的阶段使用的1.13
版本,满足官网的安装条件,但是发现不能成功,将docker版本更换为1.20
后,得到了我们想要的结果。