ELK_07_收集Docker日志

环境:
189.118----->elk01 安装es kibana
189.119----->elk02 安装 docker filebeat

filebeat 安装参考前面文档
++++++++++
# Docker的安装
## yum源准备
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache fast
## 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
yum list docker-ce.x86_64 --showduplicates |sort -r
## 安装docker-ce
yum -y install docker-ce
## 启动Docker服务
systemctl daemon-reload
systemctl restart docker
docker version
docker info
配置镜像加速器
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://uoggbpok.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

+++++++++
docker pull nginx
运行nginx 镜像:
docker run --name nginx -p 80:80 -d nginx


查看容器
docker ps


浏览器访问,模拟生成nginx 日志


查看容器日志:
docker logs -f nginx


怎么读取到这个日志啦?必须要知道这个日志在什么地方
cd /var/lib/docker/containers







这里看到的内容和 docker logs -f nginx 看到的内容是一样的。
查看docker 容器的完整ID
docker ps --no-trunc


++++++++++
修改filebeat的配置文件:
vim /etc/filebeat/filebeat.yml
添加如下内容:
### filebeat.inputs: 下面
- type: docker
  containers.ids:
    - 'a4ab7a9370d04641de5eac385ca7b37a0b27c2f62f7d6c2d88e9e2ca72985473'



### output.elasticsearch: 下面添加如下内容
- index: "docker-%{[beat.version]}-%{+yyyy.MM}"


保存,退出,重启filebeat
systemctl restart filebeat
ES 中查看数据:


登录Kibana ,创建索引数据













++++++++++
根据上面,你会发现,错误的日志和正确的日志都在一起。


stream: "stdout" ##正常
stream: "stdout" ##错误

+++++++
将错误日志和正确日志分离,写入到不同的索引

重新修改filebeat 配置文件
vim /etcf/filebeat/filebeat.yml
只需要修改 output.elasticsearch: 下面的内容
    - index: "docker-access-%{[beat.version]}-%{+yyyy.MM}"
      when.contains:
        stream: "stdout"
    - index: "docker-error-%{[beat.version]}-%{+yyyy.MM}"
      when.contains:
        stream: "stderr"


保存,退出。

删除ES里面,刚才创建的索引,和清空 Kibana 里面的索引数据
重启filebeat systemctl restart filebeat
重启的时候,这里要稍等一下,才会在ES生成两个索引
或者直接 systemctl stop filebeat 再systemctl start filebeat


在浏览中访问http://192.168.189.119,正常访问,再加上一些错误访问,模拟nginx 日志。

也可在其他虚拟机里面,crul http://192.168.189.119
登录Kibana ,创建新的索引数据。





++++++++++++

如果有多个容器,怎么收集日志?

假如我们有多个docker镜像或者重新提交了新镜像,那么直接指定ID的就不是太方便了。
我们从当前的容器提交一个新的镜像并且运行起来
docker commit nginx nginx:v2
docker images


docker run --name nginxv2 -p 8080:80 -d nginx:v2


这时,修改filebeat的配置文件:
vim /etc/filebeat/filebeat.yml



这里可以不用加 paths: 这一项,因为我们这里直接写的是 containers.ids:

filbeat 可以自动找到docker 容器日志位置,也可以加上。

如果加上的话:
############### docker ########
- type: docker
  containers:
    path: "/var/lib/docker/containers"
      ids:
        - '*'
这时就不需要清除ES里面的索引了,因为是新收集容器的日志,也是写在原来的两个索引里面。
重启filebeat
在浏览中访问http://192.168.189.119:8080,正常访问,再加上一些错误访问,模拟nginx 日志。
也可在其他虚拟机里面,crul http://192.168.189.119:8080
刷新kibana,查看数据。





以上还有两个问题:
1、两个容器的日志都存储在一个索引里面,access日志,不能正常区分,需要借助容器ID,不方便。
2、如何区分不同服务的不同容器的日志