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閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容