ELK日志分析系统理论加实操演练!!


前言

收集和分析日志是应用开发中至关重要的一环,互联网大规模、分布式的特性决定了日志的源头越来越分散,

产生的速度越来越快,传统的手段和工具显得日益力不从心。在规模化场景下,grep、awk
无法快速发挥作用,我们需要一种高效、灵活的日志分析方式,可以给故障处理,问题定位提供更好的支持。基于全文搜索引擎 Lucene 构建的
ELKstack 平台,是目前比较流行的日志收集方解决方案。

ELK系统的部署按照官方文档操作即可,相关资料也很多,这篇文章更多的关注三个组件的设计和实现,帮助大家了解这个流行的日志收集系统,

一:ELK统一日志系统

结合Logstash,ElasticSearch和Kibana三个组件,可以搭建一套高效的日志收集和分析系统。

1.1:ELK日志系统数据流图

ELK stack支持组件间的灵活组合,提供强大的开箱即用的日志收集和检索功能。

mark

可以看到ELK系统进行日志收集的过程可以分为三个环节:

  • 日志收集和导入ElasticSearch
  • ElasticSearch进行索引等处理
  • 可视化操作,查询等

Logstash可以结合Redis或者kafka等收集应用服务器产生的日志,经过简单的过滤等操作后发送到ElasticSearch,ElasticSearch进行相关的索引处理,最后在Kibana进行相关的可视化操作。

二:Logstash进行日志采集

Logstash 是一种功能强大的信息采集工具,类似于同样用于日志收集的 Flume。

Logstash通过配置文件规定 Logstash 如何处理各种类型的事件流,一般包含 input、filter、output 三个部分。

Logstash 为各个部分提供相应的插件,通过 input、filter、output 三类插件完成各种处理和转换,

另外 codec 类的插件可以放在 input 和 output 部分通过简单编码来简化处理过程。

2.1:Logstash架构

Logstash使用Jruby语言编写,对于使用者来讲,Logstash本身是基于命令行界面,面向任务处理的。

Logstash的软件架构是一种带有“管道-过滤器”风格的插件式架构,作为一个开源软件,Logstash遵循Apache 2.0进行开源,第三方社区为其贡献了大量插件。

mark

这张数据流图来自官方社区,可以看到Logstash的运行时数据处理会经历三个阶段:

  • 输入阶段 接受不同来源的数据流入,可以配置codec插件进行简单的处理。
  • 过滤阶段 对流入数据进行过滤等操作,传递给output,其中“输入”与“输出”是必须有的,“过滤”阶段是可选的。
  • 输出阶段 将数据传递到消息队列,文件系统等进行进一步处理,在ELK的日志系统中,输出到ElasticSearch索引中。

三个阶段的处理任务是异步的,不存在跨阶段任务执行与同一个线程中的情况。

三:Kibana介绍

一个针对Elasticsearch的开源分析及可视化平台
搜索、查看存储在Elasticsearch索引中的数据
通过各种图表进行高级数据分析及展示

3.1:Kibana主要功能

Elasticsearch无缝之集成
整合数据,复杂数据分析
让更多团队成员受益
接口灵活,分享更容易
配置简单,可视化多数据源
简单数据导出

四:部署步骤

实验分配

系统 主机名 IP地址 主要软件
centos:7.6 node1 20.0.0.45 Elasticsearch
centos:7.6 node2 20.0.0.46 Elasticsearch
centos:7.6 apache 20.0.0.47 Logstash,Apache
centos:7.6 kibana 20.0.0.49 Kibana

4.1:在node1,node2上安装elasticsearch

  • (操作相同,只演示一台)
#关闭防火墙
[root@node1 ~]# systemctl stop firewalld.service 
[root@node1 ~]# setenforce 0            #关闭安全防护功能

[root@node1 ~]# vim /etc/hosts  ##配置解析名

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
20.0.0.45 node1
20.0.0.46 node2

'//ping node2节点查看连接性'
[root@noed1 ~]# ping node2
PING node2 (20.0.0.46) 56(84) bytes of data.
64 bytes from node2 (20.0.0.46): icmp_seq=1 ttl=64 time=0.230 ms
64 bytes from node2 (20.0.0.46): icmp_seq=2 ttl=64 time=0.617 ms
.....省略信息.........

#验证java环境
安装java环境(java环境必须是1.8版本以上的)
[root@node1 ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

'//安装elasticsearch'
[root@node1 opt]# ls
elasticsearch-5.5.0.rpm  rh
#安装
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm 

#加载系统服务
systemctl daemon-reload 
systemctl enable elasticsearch.service 

4.2:配置elasticsearch主配置文件

#备份一下
[root@node1 opt]# cp -p /etc/elasticsearch/elasticsearch.yml  /etc/elasticsearch/elasticsearch.yml.bak

[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml
'//下面的配置文件都要顶格写'

17//行 cluster.name: my-elk-cluster       #群集名称
23//行 node.name: node1                   #节点名称
33//行 path.data: /data/elk_data          #数据存放路径  '//一会去创建'
37//行 path.logs: /var/log/elasticsearch  #日志存放路径
43//行 bootstrap.memory_lock: false       #不在启动的时候锁定内存
55//行 network.host: 0.0.0.0              #提供服务绑定的IP地址,0.0.0.0代表所有地址
59//行 http.port: 9200                    #侦听端口为9200
68//行 discovery.zen.ping.unicast.hosts: ["node1", "node2"]    #集群发现通过单播实现

#反向过滤查看配置的文件
[root@node1 opt]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node1
path.data: /data/elk_data
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
'//仔细检查配置文件'

4.3:创建数据存放路径并授权

#创建数据存放点 刚刚在配置文件已经指向了
[root@node1 opt]# mkdir -p /data/elk_data
#设置权限
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data/
  • 启动elasticsearch是否成功开启
[root@node1 opt]# systemctl restart elasticsearch.service
[root@node1 opt]# systemctl stop firewalld
[root@node1 opt]# netstat -ntap | grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      88505/java          
#这边的防火墙注意关闭
  • 查看节点信息 用真机的浏览器打开 http://20.0.0.41:9200 有文件打开下面是节点的信息

mark

  • 访问node2节点

mark

  • 查看集群检查健康和状态

在真机浏览器打开20.0.0.42://20.0.0.45:9200/_cluster/health?pretty

mark

  • 查看节点状态信息

mark

4.4:在node1,node2上安装node组件依赖包

#操作相同,只演示一个
[root@noed1 opt]# ls
elasticsearch-5.5.0.rpm    node-v8.2.1.tar.gz                    rh
elasticsearch-head.tar.gz  phantomjs-2.1.1-linux-x86_64.tar.bz2

'//安装编译工具'
[root@node1 opt]# yum -y install gcc gcc-c++ make

'//解压缩'
[root@node1 opt]# tar zxvf node-v8.2.1.tar.gz

'//执行脚本文件'
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure 

'//编译及安装'
[root@node1 node-v8.2.1]# make -j3
[root@node1 node-v8.2.1]# make install

4.5:安装phantomjs前端框架

#上传安装包到/usr/local/src
[root@node1 opt]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/

[root@noed1 opt]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin/

'//复制文件便于系统所识别'
[root@noed1 bin]# cp phantomjs /usr/local/bin/

4.6:安装elasticsearch-head数据可视化管理工具

'//解压到/usr/local/src'
[root@node1 opt]# tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
[root@node1 opt]# cd /usr/local/src/
[root@node1 src]# cd elasticsearch-head/

'//安装'
[root@node1 elasticsearch-head]# npm install
npm WARN deprecated fsevents@1.2.13: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules/karma/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {
    
    "os":"darwin","arch":"any"} (current: {
    
    "os":"linux","arch":"x64"})
npm WARN elasticsearch-head@0.0.0 license should be a valid SPDX license expression

up to date in 4.855s
  • 修改elasticsearch主配置文件
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
'//末行插入'
#action.destructive_requires_name: true
http.cors.enabled: true             #开启跨区域访问支持,默认为false
http.cors.allow-origin: "*"         #跨域访问允许的域名地址

#重启服务
[root@node1 ~]# systemctl restart elasticsearch.service
  • 启动elasticsearch-head
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &     //后台运行
[1] 4515

#启动服务
[root@node1 elasticsearch-head]# netstat -ntap | grep 9100
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      4525/grunt    
[root@node1 elasticsearch-head]# netstat -ntap | grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      4398/java   
  • 在浏览器上连接并查看健康值状态

mark

  • 在Elasticsearch后面的栏中输入http://20.0.0.45:9200/

  • 然后点击连接会发现:群集健康值:greep(0 of 0)

⭐node1信息动作

⚪node2信息动作

mark

我们现在在node1节点创建索引

mark
mark

  • 登录20.0.0.45 node1主机索引

  • 索引为index-demo,类型为test,可以看到已成功创建

[root@node1 elasticsearch-head]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'

{
    
    
  "_index" : "index-demo",
  "_type" : "test",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    
    
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "created" : true
}
  • 我们来查看一下

mark

4.7:在Apache服务器上安装logstash,多elasticsearch进行对接

'//关闭防火墙跟安全防护功能'
[root@apache ~]# systemctl stop firewalld.service 
[root@apache ~]# setenforce 0

'//安装apache服务'
[root@apache ~]# yum -y install httpd   

'//启动服务'
[root@apache ~]# systemctl start httpd

#安装java环境     没有安装直接安装yum -y install java
[root@apache ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

#安装logstash
[root@apache ~]# rpm -ivh logstash-5.5.1.rpm 
#开启服务
[root@apache ~]# systemctl start logstash.service
#设置开机自启动
[root@apache ~]# systemctl enable logstash.service 

#建立logstash软连接便于系统所识别

[root@apache ~]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/

logstash(Apache)与elasticsearch(noed)功能是否正常做对接测试

Logstash这个命令测试

字段描述解释:

-f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash

-e 后面跟着字符串 该字符串可以被当作logstash的配置(如果是“ ”。则默认使用stdin作为输入、stdout作为输出

48:输入采用标准输入 输出采用标准输出–登录Apache服务器

[root@apache ~]# logstash -e 'input { stdin {} } output { stdout {} }'
...省略信息.....
The stdin plugin is now waiting for input:
19:46:30.779 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {
    
    :port=>9600}
www.shuai.com       '//标准输入'
2020-10-11T11:46:48.665Z appche www.shuai.com    '//标准输出'
  • 使用rubydebug显示详细输出,codec为一种编辑器
[root@apache ~]# logstash -e 'input { stdin {} } output { stdout { codec=>rubydebug } }'
...省略信息....

The stdin plugin is now waiting for input:
19:48:34.120 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {
    
    :port=>9600}
www.niu.com
{
    
    
    "@timestamp" => 2020-10-11T11:48:47.538Z,     '//时间'
      "@version" => "1",                          '//版本'
          "host" => "appche",                     '//主机名'
       "message" => "www.niu.com"                 '//输入的内容' 
}

'//重启logstash服务'
[root@apache ~]# systemctl restart logstash.service 
  • 使logstash将信息写入到elasticsearch##输入 输出 对接
[root@apache ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["20.0.0.45"] } }'

....省略信息......
The stdin plugin is now waiting for input:
19:52:40.945 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {
    
    :port=>9600}
www.shuai.com
  • 登录20.0.0.45:9100查看输入信息

mark

  • 查看输入的数据

mark

4.9:将系统日志文件输出到elasticsearch中

'//增加可读的权限'
[root@appche ~]# chmod o+r /var/log/messages 

'//创建文件'
[root@appche ~]# vim /etc/logstash/conf.d/system.conf

input {
    
    
        file{
    
                                     '//对象'
          path => "/var/log/messages"         '//日志目录'
          type => "system"                    '//索引类型'
          start_position => "beginning"       '//从头开始读写'
          }
      }
output {
    
    
          elasticsearch {
    
    
           hosts => ["20.0.0.45:9200"]          '//指向node1地址'
           index => "system-%{+YYYY.MM.dd}"     '//建立索引  sytem开头 后面日期格式'
            }
      }

'//重启服务'
[root@appche ~]# systemctl restart logstash.service 
  • 打开浏览器 输入http://20.0.0.45:9100 查看索引信息

  • 你会发现多出system-2020.10.11

mark

mark

五:新开一台节点服务器安装kibana

'//关闭防火墙跟安全防护功能'
[root@kibana ~]# systemctl stop firewalld.service 
[root@kibana ~]# setenforce 0

'//下载kibana'
[root@kibana ~]# rpm -ivh kibana-5.5.1-x86_64.rpm 

[root@kibana ~]# cd /etc/kibana/
'//备份一下'
[root@kibana kibana]# cp -p kibana.yml kibana.yml.bak

[root@node1 kibana]# vim kibana.yml   ##修改配置文件

2//行  server.port: 5601                               #kibana打开的端口
7//行  server.host: "0.0.0.0"                          #kibana侦听的地址
21//行 elasticsearch.url: "http://20.0.0.45:9200"      #和elasticsearch建立联系
30//行 kibana.index: ".kibana"                         #在elasticsearch添加.kibana索引           


'//启动kibana服务'
[root@kibana kibana]# systemctl start kibana.service

'//开机启动'
[root@kibana kibana]# systemctl enable kibana.service

'//查看端口'
[root@kibana kibana]# netstat -ntap | grep 5601
tcp        0      0 0.0.0.0:5601            0.0.0.0:*               LISTEN      85268/node   
  • 访问kubana http://20.0.0.49:5601

mark

5.1:如果我们想展示apache服务器对接的apache日志文件

mark

mark

5.11:统计对接apache日志文件

[root@appche ~]# vim /etc/logstash/conf.d/apache_log.conf

input {
    
    
                file{
    
    
                path => "/etc/httpd/logs/access_log"  '//输入信息'
                type => "access"
                start_position => "beginning"
                }
                file{
    
    
                path => "/etc/httpd/logs/error_log"
                type => "error"
                start_position => "beginning"
                }
}
output {
    
    
                if [type] == "access" {
    
              '//根据条件判断出信息'
                elasticsearch {
    
    
                hosts => ["20.0.0.45:9200"]
                index => "apache_access-%{+YYYY.MM.dd}"
                }
        }
                if [type] == "error" {
    
    
                elasticsearch {
    
    
                hosts => ["20.0.0.45:9200"]
                index => "apache_error-%{+YYYY.MM.dd}"
                }
        }
}

[root@apache ]# logstash -f /etc/logstash/conf.d/apache_log.conf  
##根据配置文件配置logstach

5.12:访问网页信息,查看kibana统计情况

mark

  • 浏览器访问Apache服务

mark

  • 新生成access日志

mark

##选择management>Index Patterns>create index patterns
##创建apache两个日志的信息

5.13:在kibana创建access访问日志

mark

5.14:在kibana创建error访问日志

mark

  • 查看access日志统计情况

mark

  • 查看error统计情况

mark
实验到此结束,感谢观看

猜你喜欢

转载自blog.csdn.net/weixin_47151643/article/details/109017467