后端——》springboot整合elk日志框架(elasticsearch+logstash+kibana)

语言: CN / TW / HK

简介

elk日志框架是elasticsearch、logstash、kibana的这三个技术的简称。elasticsearch是一个搜索引擎,logstash是日志管理平台,kibana是elasticsearch的gui。elk日志框架就是将日志按照我们的要求显示在网页上,并且可以进行聚合查询、筛选分析。不用再登录服务器grep匹配,也不用在日志文件中慢慢的挑error。先看效果图:

如下为:日志的定位 这是日志的显示 如下为:日志的分析 日志的分析

安装

这三个程序可以官网下载(需要_微_皮_嗯),为了方便我这里已经打包好了,可直接下载, 链接: https://download.csdn.net/download/nienianzhi1744/13192854

解压后文件夹如下:

解压目录

elasticsearch的安装

1,【配置文件修改】:修改elasticsearch-6.8.1/config目录下的elasticsearch.yml文件,添加如下配置:

```java

允许跨域请求

http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-headers: Authorization,Content-Type

开启安全校验

xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.authc.accept_default_password: true ```

如下图: elasticsearch.yml 2,【设置登录密码】:cmd命令进入到elasticsearch-6.8.1/bin目录,输入如下命令,设置登录密码:

java elasticsearch-setup-passwords auto 回车后按y执行完,会自动设置密码,如下图: 设置elasticsearch密码 将用户名和密码复制粘贴记录一下,以后会用到。 (此处有一个坑:windows下输入自动设置密码的命令不会报错,但输入手动设置密码的命令elasticsearch-setup-passwords interactive就会报错:Connection failure to: http://127.0.0.1:9200/_xpack/security/_authenticate?pretty failed: Connection refused: connect。以后有空再来研究为什么)

3,【安装elasticsearch分词器】:上一步的命令执行结束后,不要关闭窗口,继续在bin目录下执行命令安装分词器,这一步耗时稍长,中途会自动输出命令确认是否继续,我们按y继续,安装完成后窗口会自动变成可输入状态:

java elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.1/elasticsearch-analysis-ik-6.8.1.zip (这里必须要安装,否则后续集成的时候会报错:analyzer [xxx] not found for field [xxx]])

4,【启动elasticsearch】:双击elasticsearch.bat启动elasticsearch。如下图: 启动elasticsearch 启动后弹出来elasticsearch的命令窗,不要关闭,如下图: elasticsearch命令窗 5:【浏览器访问elasticsearch】:此时在浏览器中输入:http://localhost:9200/
在弹窗中输入第2步自动设置的用户名和密码: 用户名:elastic 密码:xxx 出来下图界面表示elasticsearch启动成功,这个localhost:9200 网页可以关掉了,暂时用不上它了。 elasticsearch启动成功

kibana的安装

1,【配置文件修改】:修改kibana-6.8.1-windows-x86_64\config目录下的kibana.yml文件,添加如下配置:

```java

中文汉化

i18n.locale: "zh-CN" server.host: "0.0.0.0"

ES的访问端口号

elasticsearch.url: "http://localhost:9200"

ES的用户名和密码

elasticsearch.username: "elastic" elasticsearch.password: "gJRr45HLoRVzoqyRaWxO" ``` 如下图: 修改配置文件 2:【浏览器访问kibana】:点击bin目录下的kibana.bat文件,启动成功后cmd窗口如下图所示,不要关闭窗口。 启动kibana kibana命令窗口 http://localhost:5601/。输入账户名和密码:账户名和密码是上面自动设置时提到过的 username: "elastic" password: "xxx" 登录成功如下图所示: kibana的页面

logstash的安装

1,【配置文件修改】:在logstash-6.3.0\bin目录下,新建配置文件logstash.conf,并添加如下配置(以下有两种配置,选取一种就好了):

第一种配置为读取控制台日志(我用的就是这第一种):如下: ```java

读取控制台日志

input { stdin { } }

input { tcp { host => "127.0.0.1" port => 9250 mode => "server"

tags => ["tags"]

codec => json_lines
}

}

output { stdout { codec => rubydebug } }

output { stdout{codec =>rubydebug} elasticsearch { hosts => ["localhost:9200"] index => "logback-%{+YYYY.MM.dd}" user => "elastic" password => "xxx" } } ``` 第二种是读取文件中的日志:如下

```java input { file { path => "c:/opt/logs/java-contract-info.log" # 日志文件 type => "elasticsearch" discover_interval => 3 #心跳监听日志文件是否改变 start_position => "beginning" #从文件开始处读写 } }

output { stdout{ codec => rubydebug } elasticsearch { hosts => "localhost:9200" index => "logstash-%{+YYYY.MM.dd}" user => "elastic" password => "xxx" } } (这里要讲解一下,上面配置中最值得注意的是:output.elasticsearch.index:"logstash-%{+YYYY.MM.dd}" 这里默认创建了一个名为"logstash-日期"的索引,在kibana中会用到 ) ![添加配置文件](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/03026c4153ad48c1aa803f48a14105b4~tplv-k3u1fbpfcp-zoom-1.image) 2,**【启动logstash】**:cmd进入到logstash-6.3.0\bin目录下,执行命令java logstash -f logstash.conf ``` 启动logstash 执行命令后看到:Successfully started Logstash API endpoint {:port=>9600}的输出表示Logstash 启动完成,不要关闭这个窗口,因为Logstash 会一直监听我们的idea控制台,这个cmd窗口也是不可编辑状态,如果idea控制台有能匹配上的日志(注意并非控制台所有日志都会在这个窗口打印出来,只有格式能匹配上的才会打印),会在这里按照格式输出。

集成

经过上面繁琐的配置后,在springboot中集成就比较简单了。将控制台的日志输出到kibana中进行可视化查询和分析,不需要写代码(ElasticsearchConfig、EKLController、ESRepository、ESData什么的都不需要),只需要添加依赖并做一个配置xml文件。如下步骤:

1,添加pom依赖:

先看一下我的项目结构。在模块的pom文件中添加以下配置文件。(添加之前:如果pom文件中已经有spring-boot-starter-web这个依赖,要添加exclusion排除重复的log包引用,没有就不用管。)

排除重复包的语句: xml <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions>

项目结构 在需要搭建日志系统的模块添加pom依赖的语句: ```xml

    <!-- Java High Level REST Client -->
    <!--<dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>6.5.0</version>
        <exclusions>
            <exclusion>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
            </exclusion>
        </exclusions>
    </dependency>-->
    <!--logstash-->
    <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
        <version>5.2</version>
    </dependency>
    <dependency>
        <groupId>net.logstash.log4j</groupId>
        <artifactId>jsonevent-layout</artifactId>
        <version>1.6</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <exclusions>
            <exclusion>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
            </exclusion>
        </exclusions>
        <version>1.1.8</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.1.8</version>
    </dependency>

``` PS:上面的几个依赖为什么要注释掉呢,因为只做日志的定位和分析似乎用不上 上面注释掉的jar包。

2,添加logback.xml配置文件:

从上面的项目目录结构图中不难看出,我将日志的配置文件logback.xml与springboot的配置文件放在了同一个目录下。 具体的logback.xml的内容如下:

```xml

127.0.0.1:9250 utf8 %msg%n

<!--deliver_log是日志输出的名字-->
<logger name="deliver_log" additivity="false" level="INFO">
    <!--appender-ref为映射的配置名-->
    <appender-ref ref="deliver_log_appender"/>
</logger>

``` 输出关系 springboot方面就以上的配置就OK了,不需要写其他的代码了。配置完成后启动springboot

使用

我们访问:localhost:5601后进入到kibana主页面。 点击右侧最上面的菜单Discover,系统中的名为“deliver_log”输出的日志会展示在这里,注意得有日志了才会展示在下面。如下 kibana日志展示页

1,日志定位

在discover上方的命令输入栏中:输入条件即可查询到相关的日志,多条件查询可以使用and ,or等连接符。跟sql语句很相似 日志定位

2,日志分析

1:查看索引管理

日志分析之前需要创建索引模式,只有创建了索引模式,索引中的字段才能进行聚合的统计或其他操作。

点击:管理》索引管理可以看到我们的索引,后面有一列文档数。创建索引后,如果索引对应的log没有日志的输出,那么文档数就是0,文档数为0的索引是无法创建索引模式的。也就是说,在创建说有模式之前,一定要现有日志输出(无论时输出在控制台还是输出在文件中。)

ps:可能有同学会有疑问,为什么索引管理中的名称是logback-2020.11.24。这是因为我们在前几步中,logstash-6.3.0\bin\logstash.conf中配置的,这个名称是自定义的,可更改的。 索引管理

2:创建索引模式

索引名称前缀+通配符。(如果匹配不到值,但是在索引管理中又能看到那个索引名称,那肯定索引没数据,这时候咱们需要先进行日志输出,把程序业务逻辑的日志输出出来,才能匹配上。)点击下一步 创建索引模式第一步 时间筛选字段名称选择下图所示,然后点击创建索引模式。 在这里插入图片描述

创建完成后,我们鼠标下拉,可以看见索引模式中包含了我们的实体自定义的字段名,也包含了几个elk系统自带的字段名。这些我们实体自定义的字段名就可以用来创建可视化的图表。

索引字段名 ps:如果创建索引后,字段后面没有“可搜索、可聚合的”绿色小点点,那么需要点击一下刷新,随后按确定。 刷新索引字段

3:创建视图

如下操作:可视化》点击+号》需要哪种视图(自定义,我这里选择的是表格) 创建视图 上一步操作我选择的是表格。所以视图会在右边的表格显示出来。 左边是配置聚合函数的。当然聚合函数不用手写,直接在左边的下拉框可以点出来。 比如我选择目前的elk收集了6条打印出来的实体日志,每个日志中都有我的实体中的message字段,那我想查询一下每个message的数量并且展示出来,类似:message,count(message)。就可以进行如下选择: 1:指标选:计数 2:点击存储桶,点击拆分行。字段选择message,排序依据选择指标:计数 3:点击上面的绿色三角形 运行按钮,就可以得到查询结果了 在这里插入图片描述

总结

之前的日志统计一直用的阿里云的日志服务,跟这个功能差不多,但是阿里云的日志服务是收费的,所以自个在研究这个elk,还是挺实用的。这次研究elk, 周同学的博客给了我很大启发,大家可以去看看。 时间不充足,博客中难免有疏漏错误之处,欢迎指正。elk是一个很庞大的系统,只学会怎么用还是不够的,以后我也会多来更新学习体会,欢迎互相交流