继上一篇文章《使用docker安装elk》后,我乘胜追击,想一鼓作气的完成采集日志的功能,结果在这栽了跟头,原因是因为我对docker理解不够深刻。这一篇文章讲的是使用filebeat采集日志发送到elk(可以假想成多个服务器采集日志然后发送到elk中心去)
配置要求
Linux centos
elk(我使用的是docker安装的elk,可能和普通的安装的有些不一样)
docker pull docker.elastic.co/beats/filebeat:7.1.1
在usr/local/filebeat(任意选择在哪个文件夹下下载)下下载filebeat.docker.yml
wget https://raw.githubusercontent.com/elastic/beats/8.3/deploy/docker/filebeat.docker.yml
我们在宿主机上配置好filebeat后挂载到docker filebeat(待会启动的容器)上,想要更改配置就可以直接在filebeat.docker.yml上更改然后重启容器就行
filebeat.docker.yml配置内容
- filebeat.config:
- modules:
- path: ${path.config}/modules.d/*.yml
- reload.enabled: false
-
- filebeat.autodiscover:
- providers:
- - type: docker
- hints.enabled: true
-
- processors:
- - add_cloud_metadata: ~
-
- # 日志输入配置
- filebeat.inputs:
- - type: log
- enabled: true
- paths:
- # 需要收集的日志所在的位置,可使用通配符进行配置
- - /usr/share/filebeat/logs/*
- output.elasticsearch:
- hosts: '123.105.121.12:9200'
- username: 'elastic'
- password: 'changeme'
- #output.logstash:
- # hosts: '123.105.121.12:5044'
我在这还配置了输出到logstah,不过output只能有一个,所以要使用elasticsearch作为输出目的就要注释掉logstash的配置,我这两个都试过,都能用,设置elasticsearch的话elk就不用配置logstash了,用logstash的话还得配置logstash,待会再讲配置logstash的方式
如果elasticsearch没有密码就不用写 username和password
此外,filebeat.inputs下的paths要指向容器内的路径,然后启动容器的时候挂载到宿主机存放日志的路径
- docker run --restart=always --name filebeat -d --user=root
- --volume="/usr/local/filebeat/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro"
- --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro"
- --volume="/var/run/docker.sock:/var/run/docker.sock:ro"
- --volume="/usr/local/mysql/logs:/usr/share/filebeat/logs" docker.elastic.co/beats/filebeat:7.1.1 filebeat
--restart: 指定重启后自动运行容器
--name: 设置容器名
-d: 后台运行
--user: 指定运行用户
--volume:
① 绑定一个卷,/usr/local/filebeat/filebeat.docker.yml(我们刚刚创建的配置文件):/usr/share/filebeat/filebeat.yml(在容器内的配置文件):ro(只读)
② 意思就是/usr/share/filebeat/filebeat.yml会与/usr/local/filebeat/filebeat.docker.yml同步变化,所以如果需要更改配置文件的话只需要更改/usr/local/filebeat/filebeat.docker.yml然后重启容器就行,
③ 所以--volume="/usr/local/mysql/logs:/usr/share/filebeat/logs" 这段命令就是把宿主机的/usr/local/mysql/logs与容器的:/usr/share/filebeat/logs绑定到了一起,然后配置文件里面写
/usr/share/filebeat/logs就能监听到/usr/local/mysql/logs的日志变化了
打开elk,就可以看到日志了
抱歉,上传不了图片了,不知道csdn最近怎么了,几个bug了
filebeat.docker.yml配置内容
- filebeat.config:
- modules:
- path: ${path.config}/modules.d/*.yml
- reload.enabled: false
-
- filebeat.autodiscover:
- providers:
- - type: docker
- hints.enabled: true
-
- processors:
- - add_cloud_metadata: ~
-
- # 日志输入配置
- filebeat.inputs:
- - type: log
- enabled: true
- paths:
- # 需要收集的日志所在的位置,可使用通配符进行配置
- - /usr/share/filebeat/logs/*
- #output.elasticsearch:
- # hosts: '123.105.121.12:9200'
- # username: 'elastic'
- # password: 'changeme'
- output.logstash:
- hosts: '123.105.121.12:5044'
logstash配置内容
因为没有图片演示,所以就口头叙述了,
在elk操作页面上左边的导航栏找到Stack Management,然后点击logstash采集管道,新建一个采集管道,管道id和管道描述随便写,只要配置下面编辑区域一段就行了
- input {
- beats {
- port => 5044
- }
- }
- filter {
- }
- output {
- elasticsearch {
- hosts => "134.102.65.12:9200"
- manage_template => false
- index => "%{[@metadata][beat]}-%{[@metadata][version]}"
- action => "create"
- pipeline => "%{[@metadata][pipeline]}"
- user => "elastic"
- password => "changeme"
- }
- }
同样,如果没有username password就不用写
重启filebeat
- [root@VM-8-12-centos filebeat]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 667d29176778 docker.elastic.co/beats/filebeat:7.1.1 "/usr/local/bin/dock…" 51 minutes ago Up 51 minutes filebeat
- [root@VM-8-12-centos filebeat]# docker restart 667d29176778
docker exec -it 容器id /bin/bash: 进入容器
ctrl+q+p:退出容器
docker logs 容器id:查看日志
docker stop 容器id: 停止容器运行
docker rm 容器id: 删除容器
docker ps: 查看正在运行的容器
docker ps -a:查看所有的容器包括已经停止了的
docker restart 容器id:重启容器
一个容器相当于一个系统, 使用docker exec -it 容器id /bin/bash 命令进去可以,在里面也可以使用ls等Linux命令,使用ls命令可以看到里面有着跟Linux很相似的文件目录,cd ../ 返回上一级ls也可以看到,而/bin/bash 就是它的根目录,我尝试了以下,如果直接docker exec -it 容器id 是会报错的,少了bin,bash哪个都不行