docker-compose 搭建ELK spring-boot

docker-compose 搭建ELK

本文主要是参考别人博客,并迭代记录一些原文没有遇到或者说明的问题,供自己以后有相关问题来查看,并分享给大家

个人而言,docker-compose 相对 docker 分开部署简单,可以一步到位。所以选择docker-compose搭建。

如果有遇到什么问题,请查看最后的问题记录!

环境说明

​ 云机-Debian10

docker 安装

​ 请参考:https://www.runoob.com/docker/debian-docker-install.html,讲的非常好!

docker-compose安装

​ 请参考:https://www.runoob.com/docker/docker-compose.html,这里我也再次说明一下吧。<u>主要解决服务器从github下载会很慢的问题。所以下面将直接从github下载,再复制到服务器上</u>

  1. 直接从github安装

    下载地址:https://github.com/docker/compose/releases,选定一个版本然后下载。

  2. 下载docker-compose-Linux-x86_64 linux的版本

1582798022(1).jpg
  1. 将下载的文件复制到云机上(使用scp或者用图形化界面都可以)

    scp ./docker-compose-Linux-x86_64 root@192.168.1.13:/usr/local/bin/docker-compose
    
  2. 赋予可执行权限

    如何debian提示sudo command not found,直接不用sudo或者安装一个:apt-get install sudo

    sudo chmod +x /usr/local/bin/docker-compose
    
  3. 创建软链

    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    
  4. 测试安装是否成功

    docker-compose --version
    

安装ELK环境

  • 安装ELK

    • 创建ELK的docker-compose目录

      mkdir /usr/software/elk
      
    • 从github拉取搭建ELK的脚本

      该项目是使用Docker和Docker Compose 运行最新版本的[Elastic Stack]

      git clone https://github.com/deviantony/docker-elk.git
      
    • 进入刚刚clone下来的文件夹

      cd docker-elk
      
    • 启动容器

      首次启动最好不要后台启动(守护进程),我们最好直接查看他启动的日志情况:

      方式1(可以查看到日志,首次创建最好使用这个,等观察启动没问题再使用后台启动):

      docker-compose up
      

      方式1(守护进程):

      docker-compose up -d
      

      一般控制台没有异常输出,那么就代表启动成功了:

      Successfully started Logstash API endpoint {:port=>9600}
      

      查看docker容器运行状况:

      docker ps
      
      1582855756(1).jpg

各个服务端口运行情况如下:

名称 端口 说明
Logstash TCP input 5000 用于应用传入数据进入logstash的端口
Elasticsearch HTTP 9200 是ES节点与外部通讯使用的端口。它是http协议的RESTful接口;各种CRUD操作都是走的该端口,如查询:http://localhost:9200/user/_search
Elasticsearch TCP transport 9300 是ES节点之间通讯使用的端口。它是tcp通讯端口,集群间和TCPclient都走的它。java程序中使用ES时,在配置文件中要配置该端口
Kibana 5601 Kibana的Web界面入口
  • 登入Kibana 界面

    下面就是可以见到成果的时候了!在网页输入服务器的地址:http://192.168.1.13:5601。

    登入默认的就是es的用户密码,用户名:elastic,密码:changeme

    如果是云机的外网ip,而且没办法连通的话,那么优先考虑云机服务商的安全组的配置,再考虑防火墙,Debian本身的没有开启防火墙的。所以,麻烦到云服务商的安全组配置,开放5601接口

  • 配置ELK参数,让spring boot应用的日志可以输入到logstash中

    • 进入logstash配置文件所在目录

      cd /home/xijie/app/myelk/dokcer-elk/logstash/pipeline
      
    • 打开配置文件

      vim logstash.conf
      
    • 修改内容如下:

      这里和原来的博文区别就在于,添加了es的权限验证,因为docker-compose中默认开启了 X-Pack的安全验证,如果不添加启动会没办法连接上的

      input{
              tcp {
                      mode => "server"
                      port => 5000
                      codec => json_lines
                      tags => ["data-http"]
              }
      }
      filter{
          json{
              source => "message"
              remove_field => ["message"]
          }
      }
      output{
          if "data-http" in [tags]{
              elasticsearch{
                  hosts=> ["elasticsearch:9200"]
                  index => "data-http-%{+YYYY.MM.dd}"
                  user => "elastic"
                  password => "changeme"
              }
              stdout{codec => rubydebug}
          }
      }
      

      参数说明参考文章:

      标签 说明
      input(logstash进数据接口) 使用的是tcp,说明springboot客户端需要将日志传递到该接口,该接口正是logstash服务器接口。
      filter(数据过滤器) 将message字段去掉,只是为了当展示springboot的http请求接口的数据更加规整,而不是全部展示在message字段中
      output(数据出去接口) 将数据传递给了elasticsearch,这里使用了if,当判断所出数据为所指定tag,才进行下面的配置。特别要注意index的配置,该值在kibana中需要使用,这里指定的index值为:data-http,要注意该值与tag是没有关系的,要注意区分。
    • 返回源目录,重启容器

      cd /usr/software/elk/docker-elk
      
      docker-compose restart
      
  • 配置spring-boot应用

    • 添加logstash依赖

      <dependency>
              <groupId>net.logstash.logback</groupId>
               <artifactId>logstash-logback-encoder</artifactId>
               <version>5.2</version>
      </dependency>
      
    • 添加logstash配置,修改/添加logback.xml文件,内容如下:

      这里尽量简单,就是为了打通spring-boot和logstash,打通了一切都好理解了。

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
          <include resource="org/springframework/boot/logging/logback/base.xml" />
          <root level="INFO">
              <appender-ref ref="CONSOLE" />
          </root>
          <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
              <!--配置logStash 服务地址,可以写成配置的形式,但是为了方便,就直接写死在这里-->
              <destination>192.168.1.13:5000</destination>
              <!-- 日志输出编码 -->
              <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
          </appender>
          <!--定义elk日志的名称,需要上传的则使用该logger-->
          <logger name="elk_logger" level="INFO" additivity="false">
              <appender-ref ref="LOGSTASH"/><!--输出到logstash-->
              <appender-ref ref="CONSOLE"/><!--同时输出到控制台-->
          </logger>
      </configuration>
      
      
    • 在业务代码中,使用配置好的elk_logger打印,就可以同时把日志输出到logstash,并且存入ES了。

      ....
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      ....
      private static Logger logger = LoggerFactory.getLogger("elk_logger");//必须是这个名字
      
      ...
      logger.info("我是一个简易的spring-boot连接ELK的应用");
      ...
      

      以上完整的例子代码在这里:github

  • 配置Kibana,现在只要服务器通过指定的Tag打印日志,日志信息将会上传logstash解析,并且存储到elasticsearch,然后只需要kibana配置对应的elasticsearch的index即可看到所需的日志信息。

    通过浏览器访问kibana,http://192.168.1.13:5601,然后点击最下面的management,再点击Kibanaindex_patterns

1582877894(1).jpg

​ 创建index_patterns

1582878470(1).jpg

​ 接下来,在index pattern框中填入上述创建ElK时logstash配置文件中的index信息:data-http-*

1582878795(1).jpg

注意!如果ES没有数据是无法添加索引的!所以要确保之前的操作能够成功,如果不能写入,请查看文章最下面的参考。

​ 选择@timestamp字段作为时间筛选字段。

1582878988(1).jpg

​ 点击最上面的指南针的图标(Discover),然后选中data-http*索引就能够看到对应的日志了。

1582879209(1).jpg

以上,spring-boot结合ELK的系统就搭建完成了!

错误记录

我在搭建的过程中,遇到了以下的坑,浪费了我比较多时间

  1. spring-boot无法写入logstash,但是spring-boot应用能正常启动,Kibana页面能够正常访问。

    这种情况,一般不会是应用的问题,因为应用部分配置非常简单!就算有错,在启动的时候也会非常明显,所以很有可能就是在ELK服务那边。

    查看ELK日志

    这一点,很重要!我就是一个个ELK服务看日志,才发现了问题,日志体现如下:不断的刷日志;出现以下错误:

    [2020-02-28T08:46:26,997][ERROR][io.netty.util.concurrent.DefaultPromise.rejectedExecution] Failed to submit a listener notification task. Event loop shut down?
    java.util.concurrent.RejectedExecutionException: event executor terminated
    

    以上的日志的原因是,貌似有多个logstash实例同时启动在同一端口,导致了死循环。可以参考:https://github.com/elastic/elasticsearch/issues/27226,上面说In case anyone (like me) lands here with the same error: check that you're not trying to run multiple instances of Logstash on the same port!

    对于我,原因如下:

    我把原来的logstash的配置备份一份,文件结构如下:

    logstash.conf logstash.conf.bak

    于是,我就把logstash.conf.bak删除,再启动就可以了!

  2. logstash启动失败,logstash连接es失败

    日志表现如下:

    [2020-02-27T08:34:46,451][WARN ][logstash.outputs.elasticsearch] Attempted to resurrect connection to dead ES instance, but got an error. {:url=>"http://elasticsearch:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError, :error=>"Got response code '401' contacting Elasticsearch at URL 'http://elasticsearch:9200/'"}
    

    解决方案:修改logstash.conf文件,添加es的权限验证信息

    vi /home/xijie/app/myelk/dokcer-elk/logstash/pipeline/logstash.conf
    

    内容如下:

    input{
            tcp {
                    mode => "server"
                    port => 5000
                    codec => json_lines
                    tags => ["data-http"]
            }
    }
    filter{
        json{
            source => "message"
            remove_field => ["message"]
        }
    }
    output{
        if "data-http" in [tags]{
            elasticsearch{
                hosts=> ["elasticsearch:9200"]
                index => "data-http-%{+YYYY.MM.dd}"
                user => "elastic"
                password => "changeme"
            }
            stdout{codec => rubydebug}
        }
    }
    

    以上关键在于,添加了es的user和password:

     elasticsearch{
         hosts=> ["elasticsearch:9200"]
         index => "data-http-%{+YYYY.MM.dd}"
         user => "elastic"
         password => "changeme"
     }
    

    总结

    ​ 通过docker-compose能够快速的搭建ELK环境,然后再通过logstash的jar可以非常方便的将应用的日志推送到logstash,下面我会继续熟悉Kibana的使用。

    参考

    docker部署ELK(logstash、elasticsearch、kibana),监控日志
    https://github.com/deviantony/docker-elk/issues/446

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容