“ 本文开始前,先来回顾下上一篇docker 入门,主要讲解了如何限制容器使用的资源。本篇将来聊下如何查看容器内产生的日志。”
前言
一般地,日志这个鬼有时还挺烦的,平时都不怎么关注,但是需要用时却没有那就很烦了。而docker日志可分为两类:
docker 日志
docker 内应用日志
下面将一起来探讨一下如何用最佳的姿势来管理这两类日志。
01
—
docker 日志
docker提供了logs指令,在docker 入门(二)里有讲到这个指令,它是用来查看对应容器所产生的日志的。它的内容主要来自于STDOUT(标准输出)、STDERR(标准错误输出)。而在生产环境中,应用产生的日志都是记录到特定的文本文件里,那我们使用此命令是看不到啥有用信息的。我们可以先看下容器产生的日志在哪里,通过下面的命令可查到:
docker inspect --format='{{.LogPath}}' 容器id
/var/lib/docker/containers/容器id/容器id-json.log
json-file是默认的docker logging driver。每个docker容器启动后都会在/var/lib/docker/containers目录产生相关的日志文件,可以使用诸如filebeat、logstash等工具来抓取。但是要进行索引区分的话,还是比较难的。除非加上一些解析,但这种是很繁琐的。
02
—
docker 服务日志
比如我们有一个.net core应用,使用log4net来记录应用产生的日志,而日志会记录到特定的文件目录中去。而由于容器销毁后,应用产生的日志也会同时被销毁。那我们该怎么采集这类日志呢?
可以使用卷,将日志目录挂载到宿主机,宿主机通过filebeat、logstash等做采集。
在容器内部运行一个数据采集器,例如:filebeat、logstash,做实时采集。但要对其做一些资源限制,以防和应用本身争抢资源。
使用开源的log-pilot解决方案,它能通过声明式配置来实现强大的容器事件管理,可获取到容器的标准输出和内部文件日志。
这三种都能实现对应用的日志采集,最佳实践肯定是第三种了,它仅仅只是简单的运行一个容器,通过简单的标签声明便能抓取到应用的日志,可以说是简单到极致了。但往往简单的东西内部都还蛮复杂的。为什么不推荐第一二种呢?第一种无法采集到容器内部信息,与是否部署在容器上似乎一点联系也没有。第二种主要是还要部署额外服务,造成运维负担,造成架构复杂。
03
—
log-pilot 把玩
这个玩意的运行依赖于docker、docker-compose,需要先行安装这两个工具。先执行如下命令,clone下这个库
git clone https://github.com/AliyunContainerService/log-pilot.git
目录结构大致如下:

为了快速看下效果,我们先执行如下命令:
cd quickstart/filebeat

设置run为可执行程序
chmod 777 run
pilot:image: registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.9.5-filebeat
最后执行如下命令:
./run

正如提示所输出的,到kibana上去创建对应的index-pattern就可以看到抓取到的日志了。简直不要太好了。效果看到了,不禁好奇它怎么做到的呢?看如下代码:
docker-compose -p quickstart -f es.yml up -d
这是容器启动脚本。-f 后接一个参数,表示服务配置文件,默认为docker-compose.yml,而这里指定了es.yml。在来看es.yml的内容:
version: '2'services:elasticsearch:ports:- 9200:9200image: elasticsearch:5.5.1kibana:image: kibana:5.5.1ports:- 5601:5601environment:ELASTICSEARCH_URL: http://elasticsearch:9200/links:- elasticsearchpilot:image: registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.9.5-filebeatvolumes:- /etc/localtime:/etc/localtime- /var/run/docker.sock:/var/run/docker.sock- /var/lib/filebeat:/var/lib/filebeat- /var/log/filebeat:/var/log/filebeat- /:/host:rocap_add:- SYS_ADMINenvironment:LOGGING_OUTPUT: elasticsearchPILOT_LOG_PREFIX: "aliyun,custom"ELASTICSEARCH_HOSTS: elasticsearch:9200links:- elasticsearch
从内容可以看到这里定义了三个services节点。主要关注下pilot节点配置。可以看到pilot配置节有个environment设置项,重点关注下PILOT_LOG_PREFIX,值被设置为“aliyun,custom”,默认是“aliyun”,也就是poilt会采集带有这类标签名的容器日志。另外两项则是使用elasticsearch的相关设置。接着在来看下busybox.yml文件:
busybox:image: busyboxrestart: alwayslabels:aliyun.logs.busybox: stdoutaliyun.logs.busybox.tags: app=busybox,stage=testcommand: >sh -c 'while true; do date "+%Y-%m-%d %H:%M:%S" && sleep 1; done'log_opt:max-size: '1k'max-file: '2'
这个可以认定为是某个具体的应用。可以看出,他与我们其他常规的应用配置并没有什么区别,唯一多出来的便是这个labels标签。他们的规则可分为两种:aliyun.logs.$name:$path
$name是elasticsearch生成的索引名称,$path可为stdout或具体的文件日志目录
aliyun.log.$name.tags:$value
$value可以指定多个值,用逗号分隔,最终将会作为日志的一个字段体现在kibana上

在来看一个tomcat.yml文件
tomcat:image: tomcatports:- "8080:8080"restart: alwaysvolumes:- usr/local/tomcat/logslabels:aliyun.logs.catalina: stdoutaliyun.logs.catalina.tags: app=tomcat,stage=testaliyun.logs.access: usr/local/tomcat/logs/catalina.*.logaliyun.logs.access.tags: app=tomcat,stage=test
按照配置应该会生成catalina、access两个索引,同时有对应的tags设置。


就是这么的简单!
写在最后
本文主要讨论了容器下日志抓取的几种方案,从中可以看出,使用开源的log-pilot方案无疑是最佳的,应用接入的成本最低,最便捷。下一篇将会介绍下如何对容器做监控。

如有收获,点个在看,诚挚感谢




