• SpringBoot进阶教程(七十四)整合ELK


    在上一篇文章《SpringBoot进阶教程(七十三)整合elasticsearch 》,已经详细介绍了关于elasticsearch的安装与使用,现在主要来看看关于ELK的定义、安装及使用。

    v简介

    1.什么是ELK?

    ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana。

    ElasticSearch:ElasticSearch简称ES,它是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎Apache Lucene基础上的搜索引擎,使用Java语言编写。关于ES的更多介绍,可以看看《SpringBoot进阶教程(七十三)整合elasticsearch 》

    Logstash:Logstash是一个具有实时传输能力的数据收集引擎,用来进行数据收集(如:读取文本文件)、解析,并将数据发送给ES。

    Kibana:Kibana为Elasticsearch提供了分析和可视化的Web平台。它可以在Elasticsearch的索引中查找,交互数据,并生成各种维度表格、图形。

    2.ELK的用途

    2.1问题排查:我们常说,运维和开发这一辈子无非就是和问题在战斗,所以这个说起来很朴实的四个字,其实是沉甸甸的。很多公司其实不缺钱,就要稳定,而要稳定,就要运维和开发能够快速的定位问题,甚至防微杜渐,把问题杀死在摇篮里。日志分析技术显然问题排查的基石。基于日志做问题排查,还有一个很帅的技术,叫全链路追踪,比如阿里的eagleeye 或者Google的dapper,也算是日志分析技术里的一种。

    2.2监控和预警:日志,监控,预警是相辅相成的。基于日志的监控,预警使得运维有自己的机械战队,大大节省人力以及延长运维的寿命。

    2.3关联事件:多个数据源产生的日志进行联动分析,通过某种分析算法,就能够解决生活中各个问题。比如金融里的风险欺诈等。这个可以可以应用到无数领域了,取决于你的想象力。

    2.4数据分析:这个对于数据分析师,还有算法工程师都是有所裨益的。

    vdocker安装elk

    1. 拉取镜像

    docker pull elasticsearch:7.5.1
    docker pull logstash:7.5.1
    docker pull kibana:7.5.1

    注意各个版本尽量保持一致,否则可能会报错。

    2. 创建docker-compose.yml

    因为elk涉及到多个镜像,所以使用docker-compose的方式,会比较方便。如果还没有安装docker-compose的,可以看看这篇文章

    创建目录: mkdir /usr/local/docker/elk

    创建docker-compose.yml文件 vi docker-compose.yml

    version: '3'
    services:
      elasticsearch:
        image: elasticsearch:7.5.1
        container_name: elasticsearch
        environment:
          - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
          - "discovery.type=single-node" #以单一节点模式启动
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小
        volumes:
          - /usr/local/docker/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
          - /usr/local/docker/elk/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
        ports:
          - 9200:9200
      kibana:
        image: kibana:7.5.1
        container_name: kibana
        depends_on:
          - elasticsearch #kibana在elasticsearch启动之后再启动
        environment:
          - ELASTICSEARCH_URL=http://elasticsearch:9200 #设置访问elasticsearch的地址
        ports:
          - 5601:5601
      logstash:
        image: logstash:7.5.1
        container_name: logstash
        volumes:
          - /usr/local/docker/elk/logstash/logstash-springboot.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
        depends_on:
          - elasticsearch #kibana在elasticsearch启动之后再启动
        links:
          - elasticsearch:es #可以用es这个域名访问elasticsearch服务
        ports:
          - 4560:4560

    !wd保存。

    3. 创建logstash-springboot.conf

    创建 logstash目录 mkdir /usr/local/docker/elk/logstash

    cd logstash 进入logstash 目录

    创建logstash-springboot.conf配置文件 vi logstash-springboot.conf

    input {
      tcp {
        mode => "server"
        host => "0.0.0.0"
        port => 4560
        codec => json_lines
      }
    }
    output {
      elasticsearch {
        hosts => "es:9200"
        index => "springboot-logstash-%{+YYYY.MM.dd}"
      }
    }

    cd .. 返回上一级目录,即回到docker-compose所在的目录( /usr/local/docker/elk )。

    4. 启动ELK

    docker-compose up -d

    访问Kibana(访问地址:http://ip:5601),会看到异常信息 Cannot connect to the Elasticsearch cluster currently configured for Kibana. 再通过 docker ps -a 发现elasticsearch实例挂了。

    通过 docker logs -f elasticsearch 可以看到,es容器里的/usr/share/elasticsearch/data/nodes文件夹目录没有读写权限,实际上是没有宿主机/usr/local/es/data的读写权限。

    chmod 777 /usr/local/docker/elk/elasticsearch/data

    然后重启一下 docker-compose restart

    请求url http://toutou.com:5601 ,搞定。

    注意:如果启动ELK之后马上请求url,会提示 Kibana server is not ready yet ,等一会就好了。因为ELK三个应用之间创建连接也需要一点时间。

    vspringboot整合elk

    1. 添加引用

            <dependency>
                <groupId>net.logstash.logback</groupId>
                <artifactId>logstash-logback-encoder</artifactId>
                <version>5.2</version>
            </dependency>

    2. 添加logback.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
        <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
        <!--应用名称-->
        <property name="APP_NAME" value="myshop-demo-elk"/>
        <!--日志文件保存路径-->
        <property name="LOG_FILE_PATH" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/>
        <contextName>${APP_NAME}</contextName>
        <!--每天记录日志到文件appender-->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>${FILE_LOG_PATTERN}</pattern>
            </encoder>
        </appender>
        <!--输出到logstash的appender-->
        <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <!--可以访问的logstash日志收集端口-->
            <destination>toutou.com:4560</destination>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
        </appender>
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
            <appender-ref ref="LOGSTASH"/>
        </root>
    </configuration>

    注意:appender节点下的destination需要改成自己的logstash服务地址,比如我的是:toutou.com:4560

    如果logback.xml不知道怎么配的话,可以看看这篇文章:SpringBoot入门教程(八)配置logback日志

    3. 添加测试Controller

    /**
     * @author toutou
     * @date by 2021/2
     * @des   https://www.cnblogs.com/toutou
     */
    @Slf4j
    @RestController
    public class IndexController {
        @GetMapping("/elk")
        public Result index() {
            String message = "logback ELK成功接入了,时间:" + new Date();
            log.info(message);
            return Result.setSuccessResult(message);
        }
    }

    关于springboot的整合就可以了,然后启动SpringBoot应用就行。

    v配置kibana

    请求url http://toutou.com:5601 ,点击Explore on my own。

    1. 创建索引

    SpringBoot进阶教程(七十四)整合ELK

    SpringBoot进阶教程(七十四)整合ELK

    SpringBoot进阶教程(七十四)整合ELK

    依次按上图中的步骤创建索引。

    2. 查看收集日志

    SpringBoot进阶教程(七十四)整合ELK

    SpringBoot进阶教程(七十四)整合ELK

    3. 添加过滤条件,查找符合条件的日志

    SpringBoot进阶教程(七十四)整合ELK

    4. 添加过滤条件

    通过日志查询,我们会发现有很多debug的无效日志,这种日志可能不是太需要,而且会影响我们查询真正有用的日志。这样我们就可以在收集日志的时候,修改logstash-springboot.conf配置,通过logstash-springboot.conf来移除debug级别的日志。更新后的配置如下:

    input {
      tcp {
        mode => "server"
        host => "0.0.0.0"
        port => 4560
        codec => json_lines
      }
    }
    output {
        if [level] != "ERROR"  {
            elasticsearch {
                hosts => "es:9200"
                index => "springboot-logstash-%{+YYYY.MM.dd}"
            }
        }
    }

    vkibana汉化

    1. 进入kibana容器

    docker exec -it kibana /bin/bash

    2. 编辑文件

    vi /opt/kibana/config/kibana.yml

    修改该文件 在文件最后加上一行配置

    i18n.locale: zh-CN

    注意:zhe-CN和:号之间必须有个空格,否则kibana无法启动

    重启,即可看到访问的 kibana已汉化。

    SpringBoot进阶教程(七十四)整合ELK

    v源码地址

    https://github.com/toutouge/javademosecond/tree/master/hellolearn


    作  者:请叫我头头哥
    出  处:http://www.cnblogs.com/toutou/
    关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
    版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
    特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是作者坚持原创和持续写作的最大动力!

    <script type="text/javascript">// </script>
  • 相关阅读:
    ECMAScript2017之async function
    ES3之closure ( 闭包 )
    RxJS之AsyncSubject
    RxJS之BehaviorSubject
    RxJS之Subject主题 ( Angular环境 )
    RxJS之工具操作符 ( Angular环境 )
    RxJS之转化操作符 ( Angular环境 )
    RxJS之过滤操作符 ( Angular环境 )
    RxJS之组合操作符 ( Angular环境 )
    关于Qt的StyleSheet作用范围
  • 原文地址:https://www.cnblogs.com/toutou/p/SpringBoot_elk.html
Copyright © 2020-2023  润新知