ELK监控spring-boot日志环境搭建-Docker

477 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

ELK了解

ELK是Elasticsearch、Logstash、Kibana三者的简称,其中Elasticsearch是一个很牛逼的分布式数据存储、搜索引擎;Logstash是一个数据数据的二道贩子,能从各种渠道收集数据,然后处理,再转手送到elasticsearch或者其余数据存储中心;kibana是一个数据展示中心。三者结合下就可以实现将各个应用的日志都集中到一起,非常方便在生产环境中分析日志,帮助排查问题(估计是的,作为一个小开发,表示没经历过。。。)。

Docker方式部署单机环境

elk是可以进行集群部署的,但是一般的开发环境,甚至是一些数据量不大的系统,单机环境足矣。

这里我的版本选择的是7.15.2,是在spring官网中的spring data中看到spring与Elasticsearch是有集成支持的,所以就根据用的spring boot以及spring的版本选择了一个版本。版本上区别较大的应该是8.x与7.x之间,8.x默认开启了数据安全策略,区别较大。如果你的版本选择的是8.x,就需要需要去了解8.x版本的部署方式。

Windows环境下的部署可参考:Windows部署ELK监控spring boot日志开发环境搭建

部署Elasticsearch

  1. 拉取镜像elasticsearch镜像 docker官方镜像网站hub.docker.com/ 没有7.15.2版本,所以直接执行docker pull elasticsearch:7.15.2 无法成功拉取,需要去elastic stack官方提供的镜像网址拉取。

    docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.2
    
  2. 创建docker网络,取名elk(名字随意),用于elasticsearch、logstash、kibana之间的通信

    docker network create elk
    
  3. 运行elasticsearch容器,暴露端口9200、9300,使用网络elk,single-node discovery ,该发现允许绕过单节点开发集群中的 bootstrap checks 检查。

    docker run -d --name elasticsearch --net elk -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.15.2
    

    然后访问部署电脑的9200端口,出现如下图所示代表部署成功:

    1670423106837.jpg

部署Kibana

  1. 拉取kibana镜像

    docker pull docker.elastic.co/kibana/kibana:7.15.2
    
  2. 运行kibana容器,使用上面创建的elk网络,暴露端口5601,ELASTICSEARCH_HOSTS 是设置连接到同一网络的elasticsearch容器的9200端口,I18N_LOCALE 是国际化语言设置,这里设置成中文。

    docker run -d --name kibana --net elk -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://elasticsearch:9200" -e "I18N_LOCALE=zh-CN" docker.elastic.co/kibana/kibana:7.15.2
    

    访问http://localhost:5601(不在本机部署的就是具体的localhost就换成具体IP)出现下图所示界面代表启动成功:

    1670423417818.jpg

部署Logstash

  1. 拉取镜像

    docker pull docker.elastic.co/logstash/logstash:7.15.2
    
  2. 准备相关配置文件

    logstash启动时必须指定一个pipeline的配置,不理解可以直接理解成得指定一个包含input、filter(可选) 、output的配置,在Windows或者Linux下我们可以在执行启动命令时以参数的形式携带,但是在docker里面,我们就需要提前准备好配置文件,让容器启动的时候自己能找到。

    在%HOME%目录下创建一个elk/logstash文件夹,用户存放相关配置文件

    (base) spy@LAPTOP-S33NVIQ3:~/elk$ tree
    .
    └── logstash
        ├── logstash.yml
        └── myconf
            └── my-logstash.conf
    
    2 directories, 2 files
    

    logstash.yml:

    logstash的配置文件,logstash在启动时会加载这个文件里面的配置选项,在这里面配置了配置文件的路径,logstash默认的配置文件存放在/usr/share/logstash/config 下的,为了不影响到它原本的配置,在与它同级的目录下创建了一个myconf来存放我们自己的配置。

    path.config: /usr/share/logstash/myconf/*.conf
    

    my-logstash.conf:

    配置内容:在input中定义了两个插件,一个tcp的4560端口,一个是控制台的标准输入;在output中配置了elasticsearch的地址,以及推送到elasticsearch中的哪个索引,索引不存在会进行创建,以及控制台的标准输出。

    input {
      tcp {
        port => 4560
        codec => json_lines
        ssl_enable => false
      }
      stdin{
    
      }
    }
    
    output {
      elasticsearch {
        hosts => ["http://elasticsearch:9200"]
        index => "dtaf-%{+YYYY.MM.dd}"
      }
      stdout{
        codec=>rubydebug
      }
    }
    
  3. 运行容器

    为了方便观察启动是否成功,可以先取消-d选项。

    docker -d run --name logstash --net elk -p 4560:4560 -v /home/spy/elk/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml -v /home/spy/elk/logstash/myconf/my-logstash.conf:/usr/share/logstash/myconf/my-logstash.conf  docker.elastic.co/logstash/logstash:7.15.2
    

    若启动之后出现类似下图的界面就代表成功启动并连接到elasticsearch。

    1670423557688.jpg

  4. 配置spring boot项目

    pom.xml:

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

    logback-spring.xml:

    增加下面的配置,这里的日志框架是logback,其余的日志框架另行百度。

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    
      <!-- logstash,将日志推送到logstash -->
      <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>localhost:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
      </appender>
    
      <!-- 总环境日志配置 -->
      <root level="DEBUG">
        <appender-ref ref="LOGSTASH"/>
      </root>
    </configuration>
    

    启动spring boot,出现下图界面就代表成功抓取到日志,红框是input到的日志,绿色的是配置文件中的stdout插件的codec配置了rubydebug的原因,这个就和最终推送到elasticsearch之后看到的差不多。

    image.png

    再去kibana中查看,下图中的索引就是上面配置的mylostash.conf配置文件中配置的elasticsearch索引。

    image.png