基于log-pilot收集Docker容器日志实战

前言

通常在使用容器部署应用,特别是借助Kubernetes云平台管理及部署应用时,需要收集各个应用的控制台标准输出及日志文件,统一输出到Elasticsearch,并由Kibana进行可视化展示。

其中一个方案是使用log-pilot进行容器日志收集,并输出到Elasticsearchlog-pilot是由阿里云提供,但是从其GitHub代码仓库的提交记录可以看出,目前已经处于停止维护的状态,其支持的Elasticsearch版本也只到6.x,对于较新的版本7.x,从实验结果看是不支持的。

所以本文将使用Elasticsearch6.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 

创建测试容器

我们分别创建TomcatNginx容器,来测试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_catalinatest.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。

基于log-pilot收集Docker容器日志实战
在Index pattern中填写tomcat_access*,并点击下一步。

基于log-pilot收集Docker容器日志实战
选择@timestamp域,完成index pattern的创建。

查看Discover菜单,并选择我们创建的tomcat_access*过滤器,可以看到Tomcat的访问日志。

基于log-pilot收集Docker容器日志实战

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收集Docker容器日志实战
log-pilot的后台也输出了收集到的日志:

基于log-pilot收集Docker容器日志实战
接着我们在Kibana上创建nginx的index pattern,使用nginx*作为条件。

基于log-pilot收集Docker容器日志实战
回到Discover菜单,将过滤条件切换为nginx*,将看到nginx的控制台日志输出。

基于log-pilot收集Docker容器日志实战

总结

至此,通过log-pilot进行容器控制台及日志文件的内容收集,并输出到Elasticsearch的实验就结束了,特别需要说明的是,docker的版本在开始的阶段使用的1.13版本,满足官网的安装条件,但是发现不能成功,将docker版本更换为1.20后,得到了我们想要的结果。

上一篇:Canonical 开源 MicroK8 | 云原生生态周报 Vol. 25


下一篇:玩转大数据开发工具--上下全篇