docker会通过的data volume映射让容器内的应用把日志写到容器外,然后就可以用Filebeat收集这些日志文件。
而docker容器的标准输出都会到宿主机这个目录下:
/var/lib/docker/containers
docker容器日志默认记录方式为 json-file 就是将日志以json格式记录在磁盘上
格式如下:
{
"log": "2018-11-16 01:24:30.372 INFO [demo1,786a42d3b893168f,786a42d3b893168f,false] 1 --- [hystrix-test1-2] demo1.demo1.TestRest : 我收到了其他服务调用\n",
"stream": "stdout",
"time": "2018-11-16T01:24:30.37454385Z"
}
"log": "2018-11-16 01:24:30.372 INFO [demo1,786a42d3b893168f,786a42d3b893168f,false] 1 --- [hystrix-test1-2] demo1.demo1.TestRest : 我收到了其他服务调用\n",
"stream": "stdout",
"time": "2018-11-16T01:24:30.37454385Z"
}

这样我们就可以设置filebeat进行目录扫描然后传输到logstash、ES(elasticsearch)搜索因引擎中。
这个方案有一个麻烦的问题,每个文件夹代表一个容器,如果要区分索引的话就需要设置,或解析日志,多个容器副本在多个宿主机上运行,需要拿到对应的服务名称等关键字段。
如果大锅烩或一起全部收集可能会造成日志混乱,搜索排除条件增多,性能不佳等(logstash、ES服务器配置牛逼除外)