ELK日志分析

文章目录

ELK 企业级日志分析

概念

日志分析是运维工程师解决系统故障,发现问题的主要手段。日志主要包括系统日志应用程序日志安全日志

系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。

开源实时日志分析ELK平台能够完美的解决更高要求的查询、排序和统计等问题。

ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成:

  • Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载
  • Logstash 是一个完全开源的工具,它可以对你的日志进行收集、过滤,并将其存储,供以后使用
  • Kibana 是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供友好的日志分析Web 界面,可以帮助您汇总、分析和搜索重要数据日志

ELK工作原理展示图:

【APPServer集群】→→【logstash Agent 采集器】→→【ElasticSearch Cluster】→→【Kibana Server】→→【Browser】

简单来说,进行日志处理分析,一般需要经过以下几个步骤:

  1. 将日志进行集中化管理(beats)
  2. 将日志格式化(logstash)
  3. 对格式化后的数据进行索引和存储(elasticsearch)
  4. 前端数据的展示(kibana)

elasticsearch

介绍

Elasticsearch是一个基于Lucene的搜索服务器。

它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。

Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

基础核心概念:

接近实时(NRT)

lasticsearch是一个接近实时的搜索平台,这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟

集群(cluster)

一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。

集群有一个唯一性标示的名字,默认是elasticsearch,

集群名字很重要,每个节点是基于集群名字加入到其集群中的。

因此,确保在不同环境中使用不同的集群名字。

一个集群可以只有一个节点。强烈建议在配置elasticsearch时,配置成集群模式。

节点(node)

节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。

索引(index)

一个索引就是一个拥有几分相似特征的文档的集合。

一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。

索引相对于关系型数据库的库。

类型(type)

在一个索引中,你可以定义一种或多种类型。

一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。

类型相对于关系型数据库的表。

文档(document)

一个文档是一个可被索引的基础信息单元。

文档以JSON格式来表示,而JSON是一个到处存在的互联网数据交互格式。

文档相对于关系型数据库的列。

分片和副本(shards & replicas)

  • 分片的两个最主要原因:

    • 水平分割扩展,增大存储量
    • 分布式并行跨分片操作,提高性能和吞吐量
  • 副本的两个最主要原因:

    • 高可用性,以应对分片或者节点故障;分片副本要在不同的节点上
    • 增大吞吐量,搜索可以并行在所有副本上执行

logstash

介绍

Logstash由JRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上。不同于分离的代理端(agent)或主机端(server),LogStash可配置单一的代理端(agent)与其它开源软件结合,以实现不同的功能。

Logstash的理念很简单,它只做3件事情:

  • Collect:数据输入
  • Enrich:数据加工,如过滤,改写等
  • Transport:数据输出

logStash的主要组件

  • Shipper:日志收集者。负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来。通常,远程代理端(agent)只需要运行这个组件即可;

  • Indexer:日志存储者。负责接收日志并写入到本地文件。

  • Broker:日志Hub。负责连接多个Shipper和多个Indexer

  • Search and Storage:允许对事件进行搜索和存储;

  • Web Interface:基于Web的展示界面

正是由于以上组件在LogStash架构中可独立部署,才提供了更好的集群扩展性

LogStash主机分类

  • 代理主机(agent host):作为事件的传递者(shipper),将各种日志数据发送至中心主机;只需运行Logstash 代理(agent)程序;

  • 中心主机(central host):可运行包括中间转发器(Broker)、索引器(Indexer)、搜索和存储器(Search and Storage)、 Web界面端(Web Interface)在内的各个组件,以实现对日志数据的接收、处理和存储

Kibana

介绍

Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。

使用Kibana,可以通过各种图表进行高级数据分析及展示。

主要功能

  • Elasticsearch无缝之集成。Kibana架构为Elasticsearch定制,可以将任何结构化和非结构化数据加入Elasticsearch索引。Kibana还充分利用了Elasticsearch强大的搜索和分析功能。

  • 整合你的数据。Kibana能够更好地处理海量数据,并据此创建柱形图、折线图、散点图、直方图、饼图和地图。

  • 复杂数据分析。Kibana提升了Elasticsearch分析能力,能够更加智能地分析数据,执行数学转换并且根据要求对数据切割分块。

  • 接口灵活,分享更容易。使用Kibana可以更加方便地创建、保存、分享数据,并将可视化数据快速交流。

  • 配置简单。Kibana的配置和启用非常简单,用户体验非常友好。Kibana自带Web服务器,可以快速启动运行。

  • 可视化多数据源。Kibana可以非常方便地把来自Logstash、ES-Hadoop、Beats或第三方技术的数据整合到Elasticsearch,支持的第三方技术。

  • 简单数据导出。Kibana可以方便地导出感兴趣的数据,与其它数据集合并融合后快速建模分析。

配置ELK日志分析系统

环境准备

配置和安装ELK日志分析系统,安装集群方式,2个elasticsearch节点,并监控apache服务器日志

主机 主机名 IP地址 主要软件

服务器 node1 192.168.100.41 Elasticsearch Kibana

服务器 node2 192.168.100.42 Elasticsearch

服务器 apache 192.168.100.43 Logstash Apache

配置elasticsearch环境

登录192.168.100.41 更改主机名 配置域名解析 查看Java环境

bash 复制代码
[root@node1 ~]# hostnamectl set-hostname node1

[root@node1 ~]#  vi /etc/hosts
192.168.100.41   node1
192.168.100.42   node2

[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)

登录192.168.100.42 更改主机名 配置域名解析 查看Java环境

bash 复制代码
[root@node2 ~]# hostnamectl set-hostname node2

[root@node2 ~]#  vi /etc/hosts
192.168.100.41   node1
192.168.100.42   node2

[root@node2 ~]# 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软件

登录192.168.100.41,安装elasticsearch---rpm包

bash 复制代码
[root@node1 ~]# cd /opt
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm 


# 加载系统服务
[root@node1 opt]# systemctl daemon-reload    
[root@node1 opt]# systemctl enable elasticsearch.service

# 更改elasticsearch主配置文件
[root@node1 opt]# cp /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                  #不在启动的时候锁定内存:锁定物理内存地址,防止es内存被交换出去,也就是避免es使用swap交换分区,频繁的交换,会导致IOPS变高。
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]# mkdir -p /data/elk_data
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data/

# 启动elasticsearch是否成功开启
[root@node1 elasticsearch]# systemctl start elasticsearch.service
[root@node1 elasticsearch]# netstat -antp |grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      64463/java 

查看节点信息 浏览器打开 http://192.168.100.41:9200 有节点信息

{

"name" : "node1",

"cluster_name" : "my-elk-cluster",

"cluster_uuid" : "kWji5N02SvmMjKRzvKoMrw",

"version" : {

"number" : "5.5.0",

"build_hash" : "260387d",

"build_date" : "2017-06-30T23:16:05.735Z",

"build_snapshot" : false,

"lucene_version" : "6.6.0"

},

"tagline" : "You Know, for Search"

}
登录192.168.100.42,安装elasticsearch---rpm包

bash 复制代码
[root@node2 ~]# cd /opt
[root@node2 opt]# rpm -ivh elasticsearch-5.5.0.rpm 

# 加载系统服务
[root@node2 opt]# systemctl daemon-reload    
[root@node2 opt]# systemctl enable elasticsearch.service

# 更改elasticsearch主配置文件
[root@node2 opt]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
[root@node2 opt]#  vim /etc/elasticsearch/elasticsearch.yml

17/ cluster.name: my-elk-cluster                   #集群名字
23/ node.name: node2                                 #节点名字
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@node2 opt]# mkdir -p /data/elk_data
[root@node2 opt]# chown elasticsearch:elasticsearch /data/elk_data/

# 启动elasticsearch是否成功开启
[root@node2 elasticsearch]# systemctl start elasticsearch.service
[root@node2 elasticsearch]# netstat -antp |grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      64463/java 

查看节点信息 ,浏览器打开 http://192.168.100.42:9200 有节点信息

{

"name" : "node2",

"cluster_name" : "my-elk-cluster",

"cluster_uuid" : "kWji5N02SvmMjKRzvKoMrw",

"version" : {

"number" : "5.5.0",

"build_hash" : "260387d",

"build_date" : "2017-06-30T23:16:05.735Z",

"build_snapshot" : false,

"lucene_version" : "6.6.0"

},

"tagline" : "You Know, for Search"

}
http://192.168.100.41:9200/_cluster/health?pretty

#检查群集健康情况

{

"cluster_name" : "my-elk-cluster",

"status" : "green",

"timed_out" : false,

"number_of_nodes" : 2,

"number_of_data_nodes" : 2,

"active_primary_shards" : 0,

"active_shards" : 0,

"relocating_shards" : 0,

"initializing_shards" : 0,

"unassigned_shards" : 0,

"delayed_unassigned_shards" : 0,

"number_of_pending_tasks" : 0,

"number_of_in_flight_fetch" : 0,

"task_max_waiting_in_queue_millis" : 0,

"active_shards_percent_as_number" : 100.0

}
http://192.168.100.41:9200/_cluster/state?pretty

#检查群集状态信息

{

"cluster_name" : "my-elk-cluster",

"version" : 3,

"state_uuid" : "zuaMTDpvSda623YUbT9cug",

"master_node" : "57eKWdF6Q8u5Te0EI70OfA",

"blocks" : { },

"nodes" : {

"copPtNelTvKnHfAd51GXMw" : {

"name" : "node2",

"ephemeral_id" : "kU5iJbKASEScfPSLBuEbpw",

"transport_address" : "192.168.100.42:9300",

"attributes" : { }

},

"57eKWdF6Q8u5Te0EI70OfA" : {

"name" : "node1",

"ephemeral_id" : "I4r9U6oMQRKOBCgxL747-A",

"transport_address" : "192.168.100.41:9300",

"attributes" : { }

}

},

"metadata" : {

"cluster_uuid" : "kWji5N02SvmMjKRzvKoMrw",

"templates" : { },

"indices" : { },

"index-graveyard" : {

"tombstones" :

}

},

"routing_table" : {

"indices" : { }

},

"routing_nodes" : {

"unassigned" : ,

"nodes" : {

"57eKWdF6Q8u5Te0EI70OfA" : ,

"copPtNelTvKnHfAd51GXMw" :

}

}

}

安装elasticsearch-head插件

bash 复制代码
# node1主机编译安装node组件依赖包
[root@localhost opt]# cd /opt
[root@node1 opt]# tar xzvf 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

# 安装phantomjs
[root@localhost node-v8.2.1]# cd /usr/local/src/
[root@localhost src]# tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@localhost src]# cd phantomjs-2.1.1-linux-x86_64/bin
[root@localhost bin]# cp phantomjs /usr/local/bin

# 安装elasticsearch-head 数据可视化工具
[root@localhost bin]# cd /usr/local/src/
[root@localhost src]# tar xzvf elasticsearch-head.tar.gz
[root@localhost src]# cd elasticsearch-head/
[root@localhost elasticsearch-head]# npm install

# 修改主配置文件
[root@localhost ~]# cd ~
[root@localhost ~]# vim /etc/elasticsearch/elasticsearch.yml   ####下面配置文件,插末尾##
http.cors.enabled: true     ##开启跨域访问支持,默认为false
http.cors.allow-origin: "*"  ## 跨域访问允许的域名地址
[root@localhost ~]# systemctl restart elasticsearch

# 启动 elasticsearch-head 服务
[root@localhost ~]# cd /usr/local/src/elasticsearch-head/
[root@localhost elasticsearch-head]# npm run start &      #切换到后台运行
[1] 114729
[root@localhost elasticsearch-head]# 
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server

Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100

[root@localhost elasticsearch-head]# netstat -lnupt |grep 9100
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      114739/grunt        
[root@localhost elasticsearch-head]# netstat -lnupt |grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      114626/java     
bash 复制代码
#  node2主机编译安装node组件
yum install gcc gcc-c++ make -y
[root@localhost opt]# cd /opt
[root@node2 opt]# tar xzvf node-v8.2.1.tar.gz
[root@node2 opt]# cd node-v8.2.1/
[root@node2 node-v8.2.1]# ./configure 
[root@node2 node-v8.2.1]# make -j3      (等待时间较长)
[root@node2 node-v8.2.1]# make install

# 安装phantomjs
[root@node2 node-v8.2.1]# cd /usr/local/src/
[root@node2 src]# tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node2 src]# cd phantomjs-2.1.1-linux-x86_64/bin
[root@node2 bin]# cp phantomjs /usr/local/bin

# 安装elasticsearch-head
[root@node2 bin]# cd /usr/local/src/
[root@node2 src]# tar xzvf elasticsearch-head.tar.gz
[root@node2 src]# cd elasticsearch-head/
[root@node2 elasticsearch-head]# npm install

# 修改主配置文件
[root@node2 ~]# cd ~
[root@node2 ~]# vi /etc/elasticsearch/elasticsearch.yml   
#下面配置文件,插末尾
http.cors.enabled: true      #开启跨域访问支持,默认为false
http.cors.allow-origin: "*"  #跨域访问允许的域名地址
[root@localhost ~]# systemctl restart elasticsearch

#启动 elasticsearch-head  服务
[root@node2 ~]# cd /usr/local/src/elasticsearch-head/
[root@node2 elasticsearch-head]# npm run start &      #切换到后台运行
[1] 114729
[root@localhost elasticsearch-head]# 
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server

Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100

[root@node2 elasticsearch-head]# netstat -lnupt |grep 9100
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      114739/grunt        
[root@node2 elasticsearch-head]# netstat -lnupt |grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      114626/java     

打开浏览器输入http://192.168.100.41:9100/ 可以看见群集很健康是绿色

在Elasticsearch 后面的栏目中输入http://192.168.100.41:9200

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

●node1信息动作

★node2信息动作
打开浏览器输入http://192.168.100.42:9100/ 可以看见群集很健康是绿色

在Elasticsearch 后面的栏目中输入http://192.168.100.42:9200

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

●node1信息动作

★node2信息动作
node1主机索引为index-demo,类型为test

bash 复制代码
[root@node1 ~]# 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
}

安装logstash并做一些日志搜集输出到elasticsearch中

bash 复制代码
# 安装Apahce服务(httpd)
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl start httpd

# 安装Java环境
[root@apache ~]# java -version        #如果没有,安装yum -y install java
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 ~]# cd /opt
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm                                                  
[root@apache opt]# systemctl start logstash.service                                              
[root@apache opt]# systemctl enable logstash.service

#建立logstash软连接
[root@apache opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/          

Apache主机 做对接配置

logstash配置文件

Logstash配置文件主要由三部分组成:input、output、filter

bash 复制代码
[root@apache opt]# chmod o+r /var/log/messages
[root@apache opt]# ll /var/log/messages
-rw----r--. 1 root root 572555 4月  16 23:50 /var/log/messages

[root@apache opt]# vim /etc/logstash/conf.d/system.conf 
input {
       file{
        path => "/var/log/messages"
        type => "system"
        start_position => "beginning"
        }
      }
output {
        elasticsearch {
          hosts => ["192.168.100.41:9200"]
          index => "system-%{+YYYY.MM.dd}"
          }
        }

[root@apache opt]# systemctl restart logstash.service
bash 复制代码
# 在node1主机安装 kibana
[root@node1 ~]# cd /usr/local/src/
[root@node1 src]# rpm -ivh kibana-5.5.1-x86_64.rpm
[root@node1 src]# cd /etc/kibana/
[root@node1 kibana]# cp kibana.yml kibana.yml.bak
[root@node1 kibana]# vi kibana.yml
2/ server.port: 5601                # kibana打开的端口
7/ server.host: "0.0.0.0"           # kibana侦听的地址
21/ elasticsearch.url: "http://192.168.100.41:9200"             #和elasticsearch建立联系
30/ kibana.index: ".kibana"              # 在elasticsearch中添加.kibana索引

[root@node1 kibana]# systemctl start kibana.service    
[root@node1 kibana]# systemctl enable kibana.service   

对接Apache主机的 Apache 日志文件(访问的、错误的)

bash 复制代码
[root@apache opt]# cd /etc/logstash/conf.d/
[root@apache conf.d]# touch apache_log.conf
[root@apache conf.d]# vi 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 => ["192.168.100.41:9200"]
          index => "apache_access-%{+YYYY.MM.dd}"
          }
        }
        if [type] == "error" {
        elasticsearch {
          hosts => ["192.168.100.41:9200"]
          index => "apache_error-%{+YYYY.MM.dd}"
          }
        }
        }

[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf

:一定要在conf.d下执行

打开输入http://192.168.100.43

打开浏览器 输入http://192.168.100.41:9100/

查看索引信息能发现:

apache_error-2019.04.16 apache_access-2019.04.16

相关推荐
一次旅行2 小时前
【效率秘籍】Shell 函数+别名组合拳,让 80% 的重复命令变 1 个字母
大数据·elasticsearch·搜索引擎
码农学院3 小时前
Elasticsearch构建汽车零配件智能搜索与匹配系统
大数据·elasticsearch·汽车
Elastic 中国社区官方博客19 小时前
不到 5 分钟完成本地部署:Jina embedding 模型现已支持本地部署
大数据·人工智能·elasticsearch·搜索引擎·embedding·jina
二进制流水搬运工19 小时前
入职第一天拉了23个仓库,我写了个脚本解放双手
大数据·elasticsearch·搜索引擎
Elasticsearch20 小时前
在不到一小时内将 Datadog Kubernetes 仪表板迁移到 Elastic Observability
elasticsearch
.柒宇.21 小时前
Elasticsearch 核心概念与系统架构详解
elasticsearch·系统架构
风行無痕1 天前
单机Elasticsearch 8.19.18安全升级到9.4.3的过程
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 天前
使用重新设计的 AutoOps 更快地进行 Elasticsearch 问题排查
大数据·运维·前端·人工智能·elasticsearch·搜索引擎·全文检索
阿拉雷️1 天前
【搜索实战】Spring Boot 3.3 + AI Agent × Elasticsearch:让AI自动优化搜索策略,查询速度从2秒压到50毫秒
人工智能·spring boot·elasticsearch
阿里云大数据AI技术2 天前
阿里云 ES AI 引擎版:面向 Agent 场景,为亿级租户、千亿规模向量设计的搜索引擎
人工智能·elasticsearch·agent