源的日志管理方案中,最出名的莫过于 ELK 了。ELK 是三个软件的合称:Elasticsearch、Logstash、Kibana。

Elasticsearch
一个近乎实时查询的全文搜索引擎。Elasticsearch 的设计目标就是要能够处理和搜索巨量的日志数据。

Logstash
读取原始日志,并对其进行分析和过滤,然后将其转发给其他组件(比如 Elasticsearch)进行索引或存储。Logstash 支持丰富的 Input 和 Output 类型,能够处理各种应用的日志。

Kibana
一个基于 JavaScript 的 Web 图形界面程序,专门用于可视化 Elasticsearch 的数据。Kibana 能够查询 Elasticsearch 并通过丰富的图表展示结果。用户可以创建 Dashboard 来监控系统的日志。

下面我就把docker搭建elk时候的坑带着大家爬一遍

日志处理流程

首先讲解一下elk日志处理的流程
elk1
Logstash 负责从各个 Docker 容器中提取日志,Logstash将日志转发到 Elasticsearch 进行索引和保存,Kibana 分析和可视化数据。

安装elk套件

ELK 的部署方案可以非常灵活,在规模较大的生产系统中,ELK 有自己的集群,实现了高可用和负载均衡。但是这里我们选择使用容器来搭建elk来达到最简洁的,最小的部署方案。

首先elasticsearch要使用非root用户来创建所以我这里创了个一个用户:heroyf

heroyf@docker-client1:~$ sudo docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk

由于国内使用docker十分的不友好,你懂得原因,所以可能会出现下载不动,卡死等情况 ,多试几次。
然后最后可能会出现如下的报错,我这里把图片贴出来,红框圈出来的即是
elk2
这里需要提高vm.max_map_count的大小
永久的解决方案:

[root@localhost ~]# cat /etc/sysctl.conf | grep -v "vm.max_map_count" > /tmp/system_sysctl.conf
[root@localhost ~]# echo "vm.max_map_count=262144" >> /tmp/system_sysctl.conf
[root@localhost ~]# mv /tmp/system_sysctl.conf /etc/sysctl.conf
mv:是否覆盖"/etc/sysctl.conf"? y
[root@localhost ~]# cat /etc/sysctl.conf
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
vm.max_map_count=262144
[root@localhost ~]# sysctl -p
vm.max_map_count = 262144

如果出现max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]这个错误,之前我遇到过,然后重新开了个虚拟机就没了,很迷
解决办法:

[root@localhost ~]# cp /etc/security/limits.conf /etc/security/limits.conf.bak
[root@localhost ~]# cat /etc/security/limits.conf | grep -v "你的操作用户名,加入为test" > /tmp/system_limits.conf
[root@localhost ~]# echo "test hard nofile 65536" >> /tmp/system_limits.conf 
[root@localhost ~]# echo "test soft nofile 65536" >> /tmp/system_limits.conf 
[root@localhost ~]# mv /tmp/system_limits.conf /etc/security/limits.conf

修改后重新登录test用户,使用如下命令ulimit -Hn查看是否修改成功
那么我们再次启动就会发现已经成功了,查看端口
elk3
进入localhost:5601,发现已经起来了
elk4
其中:
5601 - Kibana web 接口
9200 - Elasticsearch JSON 接口
5044 - Logstash 日志接收接口

当前 Kibana 没有可显示的数据,因为当前 Elasticsearch 还没有任何日志数据。

访问一下 Elasticsearch 的 JSON 接口 http://[Host IP]:9200/_search?pretty
elk5

现在是没有数据的,我们需要写配置文件来告诉日志在哪里,接下来我们把docker的日志导入ELK

Filebeat

Docker 会将容器日志记录到 /var/lib/docker/containers/{contariner ID}/{contariner ID}-json.log,那么只要我们能够将此文件发送给 ELK 就可以实现日志管理。

我们可以通过Filebeat将指定路径下的日志文件转发给ELK,同时会实时监控日志文件,当日志更新时,Fliebeat会将新的内容发送给ELK

安装Filebeat

root@docker-client1:~# curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.3.2-amd64.deb
root@docker-client1:~# sudo dpkg -i filebeat-6.3.2-amd64.deb

配置Filebeat

我们需要在Filebeat的配置文件中配置两个点,一是需要监控文件的路径,二是发送到哪儿
我们需要在配置文件/etc/filebeat/filebeat.yml中的paths处配置log所在路径
elk6
接下来需要把配置文件发给ELK

Filebeat 可以将日志发送给 Elasticsearch 进行索引和保存;也可以先发送给 Logstash 进行分析和过滤,然后由 Logstash 转发给 Elasticsearch。

这里我直接发送给Elasticsearch
elk7
发送给Logstash,配置文件就在他的后面,看注释进行修改。
这是我最后的配置文件,大家可以参考

root@docker-client1:~# grep -v "#" /etc/filebeat/filebeat.yml |grep -v "^$"
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/syslog
    - /var/lib/docker/containers/*/*.log
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 3
setup.kibana:
output.elasticsearch:
  hosts: ["localhost:9200"]

处理的流程图:
elk8

启动Filebeat

这里我后台启动了3个容器
elk9
Filebeat 安装时已经注册为 systemd 的服务,可以直接启动服务。

root@docker-client1:~# systemctl start filebeat.service 

管理日志

再次访问http://[Host IP]:9200/_search?pretty 可以看到已经有数据了
elk10

这次我们能够看到 filebeat-* 的 index,以及 Filebeat 监控的那两个路径下的日志。
接下在就需要在Kibana中显示这些日志。

在Kibana中的这个地方配置index pattern
elk11
指定 index pattern 为 filebeat-*,这与 Elasticsearch 中的 index一致。
elk13
Time-field name 选择 @timestamp
elk14
点击 Create 创建 index pattern。
点击 Kibana 左侧 Discover 菜单,便可看到容器和 syslog 日志信息。
最后我们就能看到日志出现在了平台上
elk12
至此我们使用docker搭建基础的ELK平台完毕。
我这里后台跑了busybox输出一些内容,看能否在日志平台上输出
elk16
然后我们通过搜索关键词busybox,可以看到已经输出了
elk17

版权声明:本文为原创文章,版权归 heroyf 所有
本文链接: https://heroyf.club/2018/08/elk/


“苹果是给那些为了爱选择死亡的人的奖励”