ELK(Elasticsearch 7 + Logstash 7 + Kibana 7)实时日志分析平台

一、ELK 是什么?

“ELK”是三个开源项目的首字母缩写,这三个项目分别是:ElasticsearchLogstash Kibana

Elasticsearch:是一个搜索和分析引擎。

Logstash:是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。

Kibana:则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。

Elasticsearch 的核心是搜索引擎,所以用户开始将其用于日志用例,并希望能够轻松地对日志进行采集和可视化。有鉴于此,我们引入了强大的采集管道 Logstash 和灵活的可视化工具 Kibana。

二、ELK环境

2.1、软件版本

软件版本
CentOS7.8
JDKElasticsearch自带
Elasticsearch7.9.2
Kibana7.9.2
Logstash7.9.2

2.2、软件下载

CentOS:http://mirrors.aliyun.com/centos/7.8.2003/isos/x86_64/CentOS-7-x86_64-DVD-2003.iso

Elasticsearch、Kibana、Logstash:https://elasticsearch.cn/download/

Elasticsearch、Kibana、Logstash国内镜像地址:https://mirrors.huaweicloud.com/elasticsearch/

我们在根目录下创建software文件夹,把软件放到software文件夹。

[root@localhost ~]# mkdir /software/

三、ELK安装部署

3.1、安装Elasticsearch

1、解压elasticsearch

[root@localhost software]# tar -zxvf elasticsearch-7.9.2-linux-x86_64.tar.gz -C /usr/local/

2、修改elasticsearch.yml 配置文件

[root@localhost software]# cd /usr/local/elasticsearch-7.9.2/
[root@localhost elasticsearch-7.9.2]# vi config/elasticsearch.yml
# 修改以下几项
node.name: node-1 # 设置节点名称
network.host: 0.0.0.0 # 允许所有ip访问
cluster.initial_master_nodes: ["node-1"] #设置集群初始主节点

配置参数官方文档地址:

https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html

3、修改elasticsearch配置

在启动elasticsearch前,我们需要修改一下系统配置,否则启动会报错以下错误:

ERROR: [2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
ERROR: Elasticsearch did not exit normally - check the logs at /usr/local/elasticsearch-7.9.2/logs/
elasticsearch.log

(1)修改limits.conf文件

[root@localhost elasticsearch-7.9.2]# vim /etc/security/limits.conf

在limits.conf文件末尾添加

* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

配置完成后,断开重新连接一下,配置才会生效。 

(2)修改sysctl.conf文件

[root@localhost elasticsearch-7.9.2]# vim /etc/sysctl.conf

在sysctl.conf文件后面添加

vm.max_map_count=655360

刷新配置文件使之生效 

[root@localhost elasticsearch-7.9.2]# sysctl -p
vm.max_map_count = 655360

系统参数官方文档地址:

https://www.elastic.co/guide/en/elasticsearch/reference/current/system-config.html

4、关闭防火墙

我们一般都是把elasticsearch装在虚拟机里,在外部访问,为了方便我们把防火墙关闭,并且禁止开机启动。

[root@localhost elasticsearch-7.9.2]# firewall-cmd --state
running
[root@localhost elasticsearch-7.9.2]# systemctl stop firewalld.service
[root@localhost elasticsearch-7.9.2]# firewall-cmd --state
not running
[root@localhost elasticsearch-7.9.2]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

5、ik分词器安装(不需要可以跳过)

IK分词器下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

我们把解压好的ik分词器文件夹重命名为analysis-ik-7.9.2,并放到plugins文件夹里面,启动elasticsearch后,ik分词器就会生效。

[root@localhost ~]# cd /software/
[root@localhost software]# wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/
v7.9.2/elasticsearch-analysis-ik-7.9.2.zip
[root@localhost software]# unzip elasticsearch-analysis-ik-7.9.2.zip -d analysis-ik-7.9.2 
[root@localhost software]# mv analysis-ik-7.9.2/ /usr/local/elasticsearch-7.9.2/plugins/
[root@localhost software]# ll /usr/local/elasticsearch-7.9.2/plugins/
总用量 0
drwxr-xr-x. 3 root root 243 10月 27 00:42 analysis-ik-7.9.2

6、配置elasticsearch启动用户

Elasticsearch为了安全考虑不允许使用root用户启动Elasticsearch,所以我们需要新建一个普通用户启动程序。新建的用户名和密码都是elastic。

[root@localhost elasticsearch-7.9.2]# adduser elastic
[root@localhost elasticsearch-7.9.2]# passwd elastic
更改用户 elastic 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

使用passwd elastic 命令给elastic用户设置密码(需要输入两遍密码)时,如果密码过于简单会有提示,用 root 用户操作可忽略提示,继续输入第二遍密码强制设置密码。

将elasticsearch目录权限赋予elastic用户,并用elastic用户启动elasticsearch,启动参数后面-d表示后台启动

[root@localhost elasticsearch-7.9.2]# chown -R elastic /usr/local/elasticsearch-7.9.2/
[root@localhost elasticsearch-7.9.2]# su elastic
[elastic@localhost elasticsearch-7.9.2]$ ./bin/elasticsearch -d

 如果使用root用户启动,会有以下报错信息

[root@localhost elasticsearch-7.9.2]# ./bin/elasticsearch
[2020-10-27T00:01:56,296][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-1] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:174) ~[elasticsearch-7.9.2.jar:7.9.2]
	at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:161) ~[elasticsearch-7.9.2.jar:7.9.2]
	at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.9.2.jar:7.9.2]
	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:127) ~[elasticsearch-cli-7.9.2.jar:7.9.2]
	at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.9.2.jar:7.9.2]
	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:126) ~[elasticsearch-7.9.2.jar:7.9.2]
	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.9.2.jar:7.9.2]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
	at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:111) ~[elasticsearch-7.9.2.jar:7.9.2]
	at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:178) ~[elasticsearch-7.9.2.jar:7.9.2]
	at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:393) ~[elasticsearch-7.9.2.jar:7.9.2]
	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:170) ~[elasticsearch-7.9.2.jar:7.9.2]
	... 6 more
uncaught exception in thread [main]
java.lang.RuntimeException: can not run elasticsearch as root

root用户无法启动官方说明:

https://www.elastic.co/guide/en/elasticsearch/reference/7.9/modules-scripting-security.html#_do_not_run_as_root

7、验证 elasticsearch 是否启动成

安装elasticsearch的ip为192.168.19.12,elasticsearch 的默认端口号是9200,我们直接在浏览器中输入192.168.19.12:9200,如果返回以下信息,说明elasticsearch启动成功。

8、重启和关闭elasticsearch

elasticsearch启动后,没有命令可以优雅关闭,目前只能使用ps -ef | grep elasticsearch 查找elasticsearch进行,然后使用kill命令直接结束进程。

[root@localhost elasticsearch-7.9.2]# jps
73138 Jps
59027 Elasticsearch
[elastic@localhost elasticsearch-7.9.2]$ kill -9 59027

3.2、安装Kibana

1、解压kibana

我们把kibana直接解压到/usr/local/里面,重命名文件夹kibana-7.9.2

[root@localhost ~]# cd /software/
[root@localhost software]# tar -zxvf kibana-7.9.2-linux-x86_64.tar.gz -C /usr/local/
[root@localhost software]# cd /usr/local/
[root@localhost local]# mv kibana-7.9.2-linux-x86_64/ kibana-7.9.2

2、修改 kibana 配置文件

[root@localhost local]# cd kibana-7.9.2/
[root@localhost kibana-7.9.2]# vi config/kibana.yml

修改kibana.yml以下几个地方

# 修改以下几项
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]

 3、修改目录权限

kibana同样无法用root用户启动,root用户启动会有以下错误提示

[root@localhost kibana-7.9.2]# Kibana should not be run as root.  Use --allow-root to continue.
[1]+  退出 1                ./bin/kibana
[root@localhost kibana-7.9.2]# chown -R elastic /usr/local/kibana-7.9.2/

我们将文件夹权限赋给elastic用户,使用 elastic 用户启动,./bin/kibana & 表示后台启动,启动后会返回进程id

[root@localhost kibana-7.9.2]# chown -R elastic /usr/local/kibana-7.9.2/
[root@localhost kibana-7.9.2]# su elastic
[root@localhost kibana-7.9.2]# ./bin/kibana &
[1] 73823

 4、验证kibana

我们直接通过地址访问,虚拟机的ip为192.168.19.12,kibana的访问地址为192.168.19.12:5601。

3.3、安装Logstash

1、安装logstash

我们使用root用户安装logstash,进到/software文件夹,解压logstash-7.9.2.tar.gz到/usr/local/

[elastic@localhost ~]$ su root
密码:
[root@localhost elastic]# cd /software/
[root@localhost software]# tar -zxvf logstash-7.9.2.tar.gz -C /usr/local/

2、修改logstash配置

在logstash的config目录下,有一个logstash-sample.conf文件,这个是官方提供的配置,我们把这个复制一份,重命名为logstash.conf。

[root@localhost local]# cd logstash-7.9.2/
[root@localhost logstash-7.9.2]# ll config/
总用量 44
-rw-r--r--. 1  631  503  2019 9月  23 11:10 jvm.options
-rw-r--r--. 1  631  503  9097 9月  23 11:10 log4j2.properties
-rw-r--r--. 1  631  503   342 9月  23 11:10 logstash-sample.conf
-rw-r--r--. 1  631  503 10661 9月  23 11:10 logstash.yml
-rw-r--r--. 1  631  503  3146 9月  23 11:10 pipelines.yml
-rw-r--r--. 1  631  503  1696 9月  23 11:10 startup.options
[root@localhost logstash-7.9.2]# cp config/logstash-sample.conf  config/logstash.conf
[root@localhost logstash-7.9.2]# vi config/logstash.conf 

修改 logstash 配置文件,文件修改成如下:

input {
  file {                
    path => ["/app/logs/*.log"]
    type => "app"
    start_position => "beginning"
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "%{type}-log-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

我们这里以文件作为输入流,elasticsearch 作为输出流

input

  • path :读取日志文件作为输入流
  • type:自定义字段
  • start_position:表示文件读取位置

output 

  • hosts :表示我们把日志输出到elasticsearch。
  • index :日志在elasticsearch上建立的索引名称

3、启动logstash

我们使用后台&后台启动logstash,后台进程id会返回

[root@localhost logstash-7.9.2]# nohup ./bin/logstash -f ./config/logstash.conf &
[1] 56810
[root@localhost logstash-7.9.2]# nohup: 忽略输入并把输出追加到"nohup.out"

 启动完成后,我们可以使用jps命令验证启动是否成功

[root@localhost elasticsearch-7.9.2]# jps
73138 Jps
59027 Elasticsearch
56810 Logstash

四、搭建Spring boot项目

4.1、新建spring boot项目

我们创建一个spring boot工程,做一个简单的日志输出,项目结构如下:

 application.yml配置如下:

spring:
  application:
    name: elasticsearch
server:
  port: 10000
logging:
  config: classpath:logback-spring.xml

spring boot默认整合了logback,我们只需要配置一下logback.xml就可以安装配置进行输出了。

logback-spring.xml配置如下: 

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="PATH" value="/app/logs" />
    <property name="APP_CODE" value="app" />
    <!--控制台日志, 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d:日期、%thread 线程名、%-5level:从左显示5个字符宽度,%msg:日志消息,%n:换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!--文件日志, 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${PATH}/${APP_CODE}.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d:日期、%thread 线程名、%-5level:从左显示5个字符宽度,%msg:日志消息,%n:换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE"/>
    </root>
</configuration>

4.2、运行spring boot项目

我们把项目打成jar放到服务器上,运行

[root@localhost ~]# mkdir /app
[root@localhost ~]# cd /app
[root@localhost app]# nohup java -jar springboot-elasticsearch-0.0.1-SNAPSHOT.jar &
[1] 8291
[root@localhost app]# nohup: 忽略输入并把输出追加到"nohup.out"
[root@localhost app]# ll
总用量 17944
drwxr-xr-x. 2 root root       32 10月 30 13:51 logs
-rw-------. 1 root root      687 10月 30 13:51 nohup.out
-rw-r--r--. 1 root root 18369791 10月 30 13:50 springboot-elasticsearch-0.0.1-SNAPSHOT.jar
[root@localhost app]# ll logs/
总用量 4
-rw-r--r--. 1 root root 1876 10月 30 13:51 app.2020-10-30.log

我们访问一下项目,日志会输出到app.2020-10-30.log文件里面。

五、配置Kibana

我们打开Kibana,按找如下所示进行配置:

选择Create index pattern

index pattern name里面,我们输入要查询的索引名称,也就是logstash.conf里面配置的index => "%{type}-log-%{+YYYY.MM.dd}",这个索引名称就是app-log-2020.10.30,选择Next step

 选择Time field,点击Create index pattern

在菜单栏里面,我们再次点击Discover,我们会发现日志已经出来了。

 

我们输入关键字Apple iPhone,发现结果就是这一条

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值