ELK 日志文件分析系统

Posted serendipity_cat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ELK 日志文件分析系统相关的知识,希望对你有一定的参考价值。


一、概述

为了解决人工分析日志的难度,帮助恢复、帮助故障定位、访问来源信息等
索引自动分片、索引副本机制、restful风格接口
多数据源、自动搜索负载

二、ELK的组件

1.1 Elasticsearch

逻辑型数据库用于搜索引擎比如百度

1.2 Logstash

抓取获取日志并格式化后输出给es数据库

1.3 Kibana

es的数据进行前端数据展示,借助于它将数据进行图表化

三、日志处理步骤

1. 将日志集中化管理(四种工具)
① Packetbeat 搜索网络流量数据
② Topbeat 搜索系统、进程和文件系统级别的CPU和内存使用情况
③ Filebeat 搜集文件数据
④ winlogbeat 搜集Windows事件日志数据

框架结构
EFK(ELFK)架构 应用服务器+logstash -> Filebeat搜集 -> logstash数据格式化 ->(kafka作为消息队列) -> es数据库 -> kibaba图表化展示
应用服务器+logstash -> Filebeat搜集 -> logstash数据格式化 -> zookeeper+n*kafka

2. logstash将日志格式化并输出给es数据库
3. es对格式化后的数据进行索引和存储
4. kibanna可以对数据添加字段和图表化展示

四、Elasticsearch 介绍

Elasticsearch 由Java开发且开放源码,常用于云计算,能够达到实时搜索,并具稳定可靠快速(副本和分片)

  • 分片将索引分为多个分片,每个分片是一个独立的索引,可以位于集群中任何节点上
  • 分布式并行跨分片操作,可以提高性能和吞吐量、水平分割扩展、增大存储量
  • 副本对分片进行冗余(保存的数据跟主不同)可多副本增加允许故障数量
mysqlES
索引
类型
数据

面试题

Elasticsearch的分片和副本默认分别是几个?

五个分片和一个分片

五、Logstash 介绍

一款强大的数据处理工具,完全开源,基于消息(message-based)的简单架构,并运行在 java 虚拟机(JVM)上

  • Collect 数据收集
  • Enrich 数据加工
  • Transport 数据输出

1.1 Logstash 主要组件

1.2 Shipper 日志收集者

负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来。通常,

1.3 Indexer 日志存储

负责接收日志并写入到本地文件。

1.4 Broker 日志Hub

负责连接多个Shipper和多个Indexer

1.5 Search and Storage

允许对事件进行搜索和存储

1.6 Web Interface

基于web的展示界面
正是由于以上组件在L四stash架构中可独立部署,才提供了更好的集群扩展性
远程代理端(agent)只需要运行这个组件即可

六、Kibana 介绍

一个针对 Elasticsearch 的分析及提供友好、可视化的 Web 平台,开源免费!
用于搜索、查看存储在 Elasticsearch 索引中的数据
可以通过各种图表进行高级数据分析及展示,让海量数据更容易被理解

  • 它操作简单,基于浏览器的用户界面,可以快速创建仪表板(Dashboard)实时显示 ES 查询动态设置非常简单

Kibana架构为es定制,可以将结构化和非结构化存储到es索引中

input插件接收filter插件搜集并格式处理源数据库并output插件导出给目标数据库

七、搭建部署ELK

1.1 拓扑图

节点名IP地址使用软件
Node1192.168.0.10Elasticsearch、Kibana
Node2192.168.0.20Elasticsearch
Apache192.168.0.30Logstash

1.2 配置步骤

1.2.1 配置节点名

Node1
hostnamectl set-hostname node1
su -

Node2
hostnamectl set-hostname node2
su -

Node3
hostnamectl set-hostname apache
su -

1.2.1 配置 Elasticsearch 环境

Node1/Node2

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

yum -y install java-1.8.0-openjdk*

echo '192.168.0.10 node1' >> /etc/hosts
echo '192.168.0.20 node2' >> /etc/hosts

1.2.2 部署 Elasticsearch 软件

Node1/Node2

cd /opt
rpm -ivh elasticsearch-5.5.0.rpm

#设置开机自启
systemctl daemon-reload
systemctl enable elasticsearch.service

1.2.3 修改es主配置文件

cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak

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							#不在启动的时候锁定内存(前端缓存,与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"]	#集群发现通过单播实现


grep -v "^#" /etc/elasticsearch/elasticsearch.yml

mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data/

systemctl start elasticsearch
netstat -antp |grep 9200

1.2.4 检查集群的健康和状态

#查看节点信息
查看节点信息,用宿主机浏览器打开 http://192.168.0.10:9200
查看节点信息,用宿主机浏览器打开 http://192.168.0.20:9200
#检查群集健康情况
用宿主机浏览网页,打开 http://192.168.0.10:9200/_cluster/health?pretty
用宿主机浏览网页,打开 http://192.168.0.20:9200/_cluster/health?pretty
#检查群集状态信息
打开 http://192.168.0.10:9200/_cluster/state?pretty
打开 http://192.168.0.20:9200/_cluster/state?pretty



1.2.5 安装 elasticsearch-head 插件

安装 node 组件依赖包

cd /usr/local/
wget https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz

tar -xJf node-v10.16.3-linux-x64.tar.xz 

echo "export NODE_HOME=/usr/local/node-v10.16.3-linux-x64
export PATH=$NODE_HOME/bin:$PATH" >> /etc/profile

source /etc/profile

node -v
npm -v

1.2.6 安装 phantomjs(前端框架)

cd /usr/local/src/
#将软件包传至本目录下
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64/bin
cp phantomjs /usr/local/bin

1.2.7 安装 elasticsearch-head(数据可视化工具)

cd /usr/local/src/
#将软件包传至本目录下
tar zxvf elasticsearch-head.tar.gz

cd elasticsearch-head/
npm install

1.2.8 修改Elasticsearch主配置文件

vim /etc/elasticsearch/elasticsearch.yml
#在尾部添加配置
http.cors.enabled: true
http.cors.allow-origin: "*"
#注释
1.开启跨域访问支持,默认为false
2.跨域访问允许的域名地址


systemctl restart elasticsearch

1.2.9 启动 elasticsearch-head

cd /usr/local/src/elasticsearch-head/
npm run start &
#切换到后台运行

netstat -lnupt |grep 9100
netstat -lnupt |grep 9200


在宿主机上打开浏览器,访问 http://192.168.0.10:9100/
在宿主机上打开浏览器,访问 http://192.168.0.20:9100/

然后在 Elasticsearch 后面的栏目中摄入 http://192.168.0.10:9200,点击连接,查看群集颜色是否是健康的绿色
然后在 Elasticsearch 后面的栏目中摄入 http://192.168.0.20:9200,点击连接,查看群集颜色是否是健康的绿色

curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"fox","mesg":"hello cat"}'
#索引为index-demo,类型为test,可以看到成功创建

1.打开浏览器输入http://192.168.0.10:9100/ 查看索引信息
2.可以看见索引默认被分片5个,并且有一个副本
3.点击数据浏览,会发现在node1上创建的索引为index-demo,类型为test这些相关的信息




1.2.10 安装 logstash 搜集日志输出到 Elasticsearch 中

Apache

# 安装httpd服务
yum install -y httpd
systemctl start httpd

yum -y install java-1.8.0-openjdk*

1.2.11 安装 logstash

Apache

cd /opt
#将软件包传至本目录下
rpm -ivh logstash-5.5.1.rpm

systemctl start logstash.service
systemctl enable logstash.service

ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
#建立软连接,方便系统识别

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

Logstash [选项] [对象]
-f:通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
-e:后面跟着字符串 该字符串可以被当做logstash的配置(如果是" ",则默认使用stdin作为输入、stdout作为输出)
-t:测试配置文件是否正确,然后退出


输入采用标准输入,输出采用标准输出
logstash -e 'input { stdin{} } output { stdout{} }'
www.baidu.com		    #输入内容
www.sina.com。cn		#输入内容

#使用 rubydebug 显示详细输出,codec 为一种编解码器

logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'

www.baidu.com		#输入内容
www.sina.com.cn	    #输入内容
#使用logstash将信息写入elasticsearch输入,输出 对接
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.0.10:9200"] } }'

使用宿主机浏览 http://192.168.0.10:9100/ ,查看索引信息
使用宿主机浏览 http://192.168.0.20:9100/ ,查看索引信息


1.2.13 配置Kibana API对接

Apache

chmod o+r /var/log/messages
ll /var/log/messages


配置文件中定义的是收集系统日志(system)

vim /etc/logstash/conf.d/system.conf
input {
		file{
        path => "/var/log/messages"
        type => "system"
        start_position => "beginning"
			}
		}

output {
        elasticsearch {
          hosts => ["192.168.0.10:9200"]
          index => "system-%{+YYYY.MM.dd}"
					  }
       }

systemctl restart logstash.service


测试登录192.168.0.10:9100,连接192.168.0.10:9200 查看是否有system的索引

1.2.13 安装 Kibana

Node1

cd /usr/local/src/
#将软件包传至本目录下
rpm -ivh kibana-5.5.1-x86_64.rpm

cd /etc/kibana/
cp kibana.yml kibana.yml.bak

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


systemctl start kibana.service
systemctl enable kibana.service

访问浏览器192.168.0.10:5601

1.首次登录创建一个索引 名字:logstash-*  ##这是对接系统日志文件
Index name or pattern   
#下面输入logstash-*

2.然后点最下面的出面的create 按钮创建

3.然后点最左上角的Discover按钮,会发现logstash-*信息

4.然后点下面的host旁边的add,会发现右面的图只有Time和host选项了,个比较友好 



对接 Apache 主机的 Apache 日志文件

Apache(192.168.0.30):

cd /etc/logstash/conf.d/
touch apache_log.conf

vim 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.0.10:9200"]
          index => "apache_access-%{+YYYY.MM.dd}"
          }
        }
        if [type] == "error" {
        elasticsearch {
          hosts => ["192.168.0.10:9200"]
          index => "apache_error-%{+YYYY.MM.dd}"
          }
        }
        }

# 指定文件测试
/usr/share/logstash/bin/logstash -f apache_log.conf 

以上是关于ELK 日志文件分析系统的主要内容,如果未能解决你的问题,请参考以下文章

搭建ELK日志分析平台的详细过程

搭建ELK日志分析平台的详细过程

ELK日志分析系统

分布式文件系统和企业级应用——ELK企业级日志分析系统

ELK 实现 Java 分布式系统日志分析架构

ELK日志分析系统初体验