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

简介

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

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

安装

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

解压后文件夹如下:

解压目录

elasticsearch的安装

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

#允许跨域请求
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目录,输入如下命令,设置登录密码:

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继续,安装完成后窗口会自动变成可输入状态:

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文件,添加如下配置:

#中文汉化
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,并添加如下配置(以下有两种配置,选取一种就好了):

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

#读取控制台日志
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"
  }
}

第二种是读取文件中的日志:如下

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中会用到 ) 添加配置文件 2,【启动logstash】:cmd进入到logstash-6.3.0\bin目录下,执行命令

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包引用,没有就不用管。)

排除重复包的语句:

<exclusions>
     <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
     </exclusion>
</exclusions>

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

<!-- &lt;!&ndash;elasticsearch&ndash;&gt;
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.2.1.RELEASE</version>
        </dependency>
        &lt;!&ndash; ElasticSearch &ndash;&gt;
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.5.0</version>
        </dependency>-->
        <!-- 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 version="1.0" encoding="UTF-8"?>
<configuration>
    <!--这个是logback包中自带的base.xml文件-->
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <!--对应的映射的配置名-->
    <appender name="deliver_log_appender"
              class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--配置logStash 服务地址,9250。9250是logstash-6.3.0\bin\logstash.conf文件中配置的输出端口号 -->
        <destination>127.0.0.1:9250</destination>
        <!-- 日志输出编码 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>utf8</charset>
            <!--Pattern为日志匹配的规则,也是索引的字段名,此处我们不指定,是因为在日志的打印的时候是直接打印的实体,
            实体与的字段与值是规则的json格式,所以此处不做额外处理-->
            <Pattern>%msg%n</Pattern>
        </encoder>
    </appender>

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

输出关系 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是一个很庞大的系统,只学会怎么用还是不够的,以后我也会多来更新学习体会,欢迎互相交流

猜你喜欢

转载自juejin.im/post/7114560712017444877