ELK日志系统的搭建

发布于:2024-04-24 ⋅ 阅读:(28) ⋅ 点赞:(0)

简介

ELK是Elasticsearch、Logstash、Kibana的简称,这三者都是开源软件,通常配合使用
Elasticsearch -->存储数据
是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用Java语言编写,能对大容量的数据进行接近实时的存储、搜索和分析操作。
Logstash --> 收集数据
数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置。
Kibana --> 展示数据
数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示。

日志从生成到展示的流程
后端项目(生成日志)–>Logstash(负责收集日志)–> Elasticsearch(将日志插入es储存)–> Kibana(通过界面展示日志)

软件准备

以下安装所需要的软件都在以下链接中:
链接:https://pan.baidu.com/s/1Ejfrx8dajNQ03Sz9OeNgMw 
提取码:x51n

在这里插入图片描述

安装JDK

这个不再多说,不清楚具体怎么安装的,网上有很多教程。
将下载的JDK安装包上传至服务器/data/software目录,然后rpm直接安装JDK:
rpm -ivh /data/software/jdk-8u371-linux-x64.rpm

安装完成后 java -version //查看JDK版本号
在这里插入图片描述
如果没有显示版本信息,去/etc/profile 文件中配置下java环境变量
如果,当前机器已经安装过jdk,也可以跳过。
除了,上面的rpm安装方式,还可以选择.tar.gz的解压缩方式即免安装版本。使用tar -zxvf 包名.tar.gz。然后配置下jdk环境变量。
通过source /etc/profile 使修改的配置立即生效。

下载Elasticsearch软件

链接:https://pan.baidu.com/s/1-L3uLLJs-leR7pv2t9fRjA
提取码:d7de
通过上面的百度地址下载后,上传到/data/software目录下。
或者在cd /data/software 到此目录下。
执行
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.10.tar.gz

解压安装包到/data目录下。
tar -zxvf elasticsearch-6.8.10.tar.gz -C /data
注意:默认是解压到当前目录,可选项 -C ,使用 -C 目录指定解压后的文件夹所在的位置

修改配置信息

解压完成后,ES的目录为/data/elasticsearch-6.8.10
创建数据目录、日志目录:
mkdir -p /data/elasticsearch-6.8.10/data
mkdir -p /data/elasticsearch-6.8.10/logs
注意: -p 选项 可以创建多级目录。路径中的目录没有的话就创建。有的话则忽略。

编辑elasticsearch.yml
vim /data/elasticsearch-6.8.10/config/elasticsearch.yml #配置文件最好编辑前先备份

文件中需要添加或修改的内容如下(配置文件中默认全都是备注掉的,需要添加)
path.data: /data/elasticsearch-6.8.10/data #ES集群数据目录
path.logs: /data/elasticsearch-6.8.10/logs #ES集群日志目录

network.host: 0.0.0.0    #配置0.0.0.0允许其他地址访问
http.port: 9200    		     #对外访问端口
transport.tcp.port: 9300
transport.tcp.compress: true
http.cors.enabled: true    #允许跨域访问
http.cors.allow-origin: "*"

其他配置修改,主要是修改jvm的运行内存大小,可以根据实际情况按需修改
vim /data/elasticsearch-6.8.10/config/jvm.options
修改其中的以下两条,根据实际情况按需修改:
-Xms1g
-Xmx1g

系统参数修改:
vim /etc/security/limits.conf
在末尾增加以下内容:

*                soft    nofile          65536
*                hard    nofile          65536
*                soft    nproc           4096
*                hard    nproc           4096

在这里插入图片描述
修改/etc/sysctl.conf配置:
vim /etc/sysctl.conf
添加如下内容:

vm.max_map_count=655360

修改完成保存生效:
sysctl -p

创建ElasticSearch运行用户、启动服务

由于ES集群不允许root用户运行,需要创建ES运行用户:

# 创建用户组
groupadd es
# 创建用户并添加至用户组
useradd es -g es 
# 更改用户密码(输入 es)
passwd es
密码:es123#

修改目录权限:

sudo chown -R es:es  /data/elasticsearch-6.8.10

-R 选项:表示递归,让其下的所有文件包括目录,及子子文件及子子目录的属主:属组都改为es:es
像上面这样如果是一个目录层级,则从最后的那个目录层开始修改属组和属主
在这里插入图片描述
在这里插入图片描述
像上面这样/data目录只需要x(执行权限就行,也就是可以cd /data/)
切换到es用户

su  es

启动服务:

cd /data/elasticsearch-6.8.10/bin
./elasticsearch -d    #-d是后台启动,第一次启动时可以不加-d,查看启动的日志情况

启动后输入jps可以查看到服务状态
通过jps命令可以看到Elasticsearch的服务进程,其确实是一个java项目。

[root@localhost bin]# jps
40052 Jps
39461 Elasticsearch

通过以下两种方式判断是否服务是否正常

curl http://172.16.57.103:9200/_cat/health?v  #查看状态

或curl http://172.16.57.103:9200 #查看服务情况
在这里插入图片描述
要通过浏览器测试以上两个url 连接,需要关闭虚拟机的防火墙,或者添加访问策略。

添加防火墙策略

直接关闭防火墙太暴力,也不安全
添加防火墙策略

[root@localhost bin]# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.57.17" port protocol="tcp" port="9200" accept" 

解释一下:上面的策略的,接受 ip为172.16.57.17的地址,访问本机9200端口的服务
在这里插入图片描述
注意:–add-rich-rule= “策略内容”
这里的 source address=的值。这里源地址,不是服务端的目的ip地址,而是你打算访问服务端的物理机的地址。我的物理本机地址是:172.16.57.17。
然后让策略立即生效:

[root@localhost bin]# firewall-cmd –reload

在这里插入图片描述
然后在浏览器上执行:http://172.16.57.103:9200 就不会再打转了。会立即返回数据。

然后在浏览器上执行:http://172.16.57.103:9200 就不会再打转了。会立即返回数据。

注意:上面–add是添加策略的意思。改成–remove 就是移除策略意思。

[root@localhost bin]# firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="172.16.57.17" port protocol="tcp" port="9200" accept"

然后让移除的策略立即生效,也是执行下面的命令:

[root@localhost bin]# firewall-cmd --reload

查询防火墙某一策略是否已配置:通过 --query 指令

[root@localhost bin]# firewall-cmd --permanent --query-rich-rule="rule family="ipv4" source address="172.16.57.17" port protocol="tcp" port="9200" accept"

返回:yes,表明已配置。返回no,表明未配置

ElasticSearch-Head插件安装

安装这个插件的目的是可以通过插件提供的web界面功能,可视化的管理(查看/修改)es中的索引信息。
首先安装node.js
注意运行完ES后要切换回root用户
安装依赖:(没安的话就安装)
yum -y install gcc gcc-c++ openssl-devel
下载安装包、解压至/data目录

wget http://nodejs.org/dist/v13.9.0/node-v13.9.0-linux-x64.tar.gz
tar -zxvf node-v13.9.0-linux-x64.tar.gz -C /data

配置Node全局环境变量并生效
vim /etc/profile
#在末尾加入以下内容
export PATH=$PATH:/data/node-v13.9.0-linux-x64/bin
#wq保存退出后,输入命令生效
source /etc/profile
验证,能看到输出版本号信息则成功
在这里插入图片描述
再安装ElasticSearch-Head插件
将网盘上下载的:elasticsearch-head 上传到服务器的 /data目录下
配置修改,vim编辑Gruntfile.js文件

#进入文件夹,编辑文件
cd /data/elasticsearch-head
vim Gruntfile.js
在此处添加内容:
hostname: '0.0.0.0',

在这里插入图片描述
还是 cd /data/elasticsearch-head
编辑_site/app.js文件,搜索9200,修改localhost为ES的访问地址
在这里插入图片描述
安装所需的npm依赖库

npm install phantomjs-prebuilt@2.1.16 --ignore-scripts

然后执行npm install命令进行安装
运行服务

nohup ./node_modules/grunt/bin/grunt server > es-head-start.log 2>&1 &

服务运行后,会启动在9100端口,然后就可以在浏览器中访问查看。
在这里插入图片描述
如果上面这个界面打不开。请在cd /data/elasticsearch-head目录下查看es-head-start.log日志文件。
在这里插入图片描述

安装Kibana

下载软件包

请看开头的百度链接中的软件包kibana-6.8.10-x86_64.rpm。
将软件包上传到服务器的/data/software目录下
或者通过

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.10-x86_64.rpm  

注意: Kibana的版本需要与ElasticSearch版本一致

安装服务

rpm -ivh kibana-6.8.10-x86_64.rpm

修改配置

修改配置文件,rpm方式安装的kibana配置文件路径是/etc/kibana/kibana.yml
vim /etc/kibana/kibana.yml
文件里面的配置默认是全部注释掉的,我们需要添加如下内容:

# 服务端口
server.port: 5601
# 服务器ip  本机
server.host: "0.0.0.0"
# Elasticsearch 服务地址
elasticsearch.hosts: ["http://localhost:9200"] #如果kibana和es在同一台机器可以,这里可以使用localhost。
# 设置语言为中文
i18n.locale: "zh-CN"

:配置文件中默认注释掉的内容里有很多配置,例如ES的登录用户密码配置等,如有需要可以按需配置。

启动服务

systemctl start kibana  	#启动
systemctl status kibana		#查看状态
systemctl enable kibana    #设置开机自启

服务启动后,稍等一两分钟,然后就可以在浏览器中访问5601端口就可以看到界面了。
在这里插入图片描述

安装Logstash

安装包下载

百度网盘上找logstash-6.8.10.rpm 软件包。
或者
cd /data/software
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.10.rpm

安装服务

rpm -ivh logstash-6.8.10.rpm

配置修改

进入cd /etc/logstash/
在这里插入图片描述

配置pipeline流水线

修改pipelines.yml配置文件
在这里插入图片描述
发现它里面引用的是/etc/logstash/conf.d目录下.conf文件。
这是rpm方式安装的造成的。
但是进入此目录却发现是空的。需要从上层目录下拷贝一份配置文件。
#复制配置文件模板到/etc/logstash/conf.d目录下

cp /etc/logstash/logstash-sample.conf /etc/logstash/conf.d/logstash.conf
vim /etc/logstash/conf.d/logstash.conf

配置内容因人而异,可以按项目进行相关的配置,模板及部分配置项如下:

input {
  #beats {
  #  port => 5044
  #}
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 9600
    codec => json_lines
  }
}

output {
  stdout{
    codec => rubydebug
  }
  elasticsearch {
    hosts => ["http://localhost:9200"]
    #index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

上面的流水线配置先按这样来,后面再具体说里面的参数
在这里插入图片描述

服务配置文件

Logstash服务自身的配置文件路径为/etc/logstash/logstash.yml,包含了端口、进程大小限制、日志文件路径等配置内容,可以按需进行配置。默认端口为9600。
vim /etc/logstash/logstash.yml
#这里采用默认的方式,不修改。

启动服务

systemctl start logstash     #启动
systemctl enable logstash    #设置开机自启
systemctl status logstash    #查看状态

查看端口监听状态
netstat -nlp | grep :9600
在这里插入图片描述
还可以通过 jps命令 查看 logstash 和 es 一样都是java项目
在这里插入图片描述

全流程验证

ELK平台的部署已经全部结束了,接下来可以做一次全流程的验证测试。

准备测试用的项目

目的用来生产日志数据
从百度网盘链接里找到:StarterApi.rar
下载下来解压后导入IDEA中
在这里插入图片描述
在这里插入图片描述
这里为了简单起见,我们不采用docker容器进行部署了。
启动类是:
在这里插入图片描述
和Logstash相关的日志配置文件:
logback.xml
在这里插入图片描述
在这里插入图片描述
把配置文件中的mysql,redis服务地址都配上。
在数据库上首先手动创建一个数据库为starter。然后运行项目时,通过flyway,自动把数据库脚本初始化到starter里了。
这里说下如果通过ideal 进行编译打包。
在这里插入图片描述
没有报错的话,会在target目录下看到下面红框里的jar包,然后把这个jar包上传到服务器上。
在这里插入图片描述
将这个jar包 上传到 /data/ project 目录下:
进入/data目录里,执行以下命令:

java -Dfile.encoding=utf-8 -jar ./project/api-0.0.1-SNAPSHOT.jar > /dev/null & 

通过jps命令查看服务是否已启动
在这里插入图片描述
数据库里的表和数据也都随着项目的启动通过flyway创建好了。
在这里插入图片描述
在这里插入图片描述

查看es索引信息

curl '172.16.57.103:9200/_cat/indices?v'

在这里插入图片描述
或者通过可视化的插件界面来查看:Chrome浏览器:http://172.16.57.103:9100
在这里插入图片描述
确认es中有日志数据后。

通过kibana来查询展示es中的数据

在kibana中,必须拥有默认索引模式,才能从es中检索数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在已有索引模式的情况,再创建新的索引模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
现在默认的索引模式就切换过来了:如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

es创建索引的时间的问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将时间戳转为具体的时间后,可以发现
索引logstash-2023.07.11 的创建时间为2023-07-11 12:07:08
因为它是我们首次启动logstash后,第一次logstash和es建立联系时es创建的。
索引logstash-2023.07.12 的创建时间为北京时间2023-07-12 08:00:00。

可以看出从第二天开始es创建索引的时间是北京时间早上08:00。
原因分析如下:
在这里插入图片描述
解决方案:
1、索引的创建时间或日志写入es的时间是根据默认的"@timestamp"字段来创建写入的,所以直接给"@timestamp"加上8小时即可;这样,索引生成的时间就是00:00了。
修改vim /etc/logstash/conf.d/logstash.conf
添加以下内容:

filter {
        date {
          match => ["log_time", "yyyy-MM-dd HH:mm:ss.SSS"]
          target => "@timestamp"
        }
        ruby { 
          code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
        }
        ruby { 
          code => "event.set('@timestamp',event.get('timestamp'))"
        }
        mutate {
          remove_field => ["timestamp"]
        }
    }
}

在这里插入图片描述
修改后观察第二天索引的创建时间戳已正常改为凌晨00:00。
2、 还有一点是需要将kibana的显示时间改为UTC,默认kibana是自动根据@timestamp字段按照浏览器"Browser"的时间所在时区来的,这样会导致我们现在的时间+8小时;当改为UTC后+8h正好符合我们现在的时间。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果上面不指定UTC,而是默认的Browser的话,如果当前时区为东八区,那么kibana根据索引从es中查到的时间数据都+8小时。那么会出现比我们时间的北京时间超了8小时。所以这里选择UTC。相当于这里直接展示在插入ES时提前增加8小时后的那个时间了,也就是我们的北京时间了。

再讲一下,我们测试用到的项目中的日志系统

测试所用的springboot项目里的,application.yml文件
里面的注释是自己添加的。
在这里插入图片描述
max-size值可以设置大些,这里为了演示效果设置成了7KB,一般设置成10MB。
在这里插入图片描述
这里的.gz文件,超过7天的。只有在项目启动时,项目日志系统会定时去logs目录下扫描哪些符合被删除的归档文件。

我们这个项目的。日志 即在控制台打印,也保存到本地文件里,还把要日志传输到Logstash里。保存到本地文件里一份的这个也是必须的。因为把日志传输到Logstash端可能会失败,防止日志丢失。所以本地也要保存一份日志。

Logstash是怎么收集日志的,是和里面的logback.xml文件有关。
在这里插入图片描述
在application.xml中添加此配置路径,使配置生效

logging:
  config: classpath:logback.xml

我们的logback.xml里没有指定logbash收集到的日志的日志格式。那么就采用默认的日志格式。
Logstash不仅可以获取实时日志。还可以从指定的日志文件里读取离线日志。
在这里插入图片描述
在input里添加上红框里的内容。然后重启Logstash。
但是有一点是。它会把读取的一条日志全部赋值给,message字段。
这里就要用到filter过滤器,对input进来的日志进行切割处理。
Logstash 里的 主要的三个组件就是:

input{
 .....
}

filter{
 .....
}

output{
 .....
}

日志的流程处理顺序 input –-> filter – > output.
在这里插入图片描述
在这里插入图片描述

确保安装包的完整性和合法性

针对于RedHot下的CnetOS7:
下面分别说下常见的软件以下几种安装方式的校验合法性:
1.rpm -ivh 包全名/网络路径地址,
2.yum -y install 包名
3.还有一种是.tar.gz格式的。先wget 下载到本地再解压。(有可能是源码,也有可能是编译后的免安装的压缩版)
先说第一种:
在这里插入图片描述
我们先通过wget 命令把kibana-6.8.10-x86_64.rpm下载到服务器。
然后执行 rpm -ivh 进行安装
在这里插入图片描述
上面在安装时提示:
warning: kibana-6.8.10-x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
或rpm -ivh 包的网络路径 #下载并安装
在这里插入图片描述
报 警告:/var/tmp/rpm-tmp.0SYa24: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
都是因为:我们的服务器端没有导入对应的公钥。
解决办法:
下载并安装签名公钥:

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

也可以 先 通过 wget https://artifacts.elastic.co/GPG-KEY-elasticsearch 把公钥文件GPG-KEY-elasticsearch下载到服务器。
然后在此公钥文件所在目录执行 rpm --import GPG-KEY-elasticsearch。
说明一下:这个公钥是elastic所有部署包,这里就是说的rpm包,所共享的。
如果验证公钥已经导入成功了。

rpm -V 验证安装软件的修改 –这个我们先不用

rpm -K 验证软件包的数字签名 先导入机器的秘钥,再验证
在这里插入图片描述
在没有导入对应的rpm包的公钥时,使用rpm -K校验时就报上面这个问题。
或者在安装时警告提示上面的NOKEY。
使用上面的说的命令导入公钥后:
在这里插入图片描述
或者选择直接安装试试:
在这里插入图片描述

[root@localhost /]# wget https://artifacts.elastic.co/GPG-KEY-elasticsearch #下载下来

在这里插入图片描述
第二种通过 yum -y install kibana ,这种方式从yum源里获取资源。如果yum源里没有kibana软件包。
在这里插入图片描述
还有一个问题,如何保证这种安装时安装包的合法性。
官方给出的解决方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装中会验证,没问题就没有提示。若有问题,会给出提示。
和手机上安装app一样。都要验证签名是否有效。

第三种 使用.tar.gz方式安装

在这里插入图片描述
还有一种是通过docker 容器安装的方式。这种方式docker pull 下来镜像到本地后,要对镜像进行验证签名。这个后面遇到再补充。

日志采集流程图

方式一:
在这里插入图片描述
方式二:
在这里插入图片描述
当然也有方式三:
即 Filebeat采集的日志 直接发送到es。中间不使用Logstash。