1. 程式人生 > >Springboot專案搭配ELK日誌平臺

Springboot專案搭配ELK日誌平臺

上一篇講過了elasticsearch和kibana的視覺化組合查詢,這一篇就來看看大名鼎鼎的ELK日誌平臺是如何搞定的。

elasticsearch負責資料的儲存和檢索,kibana提供圖形介面便於管理,Logstash是個日誌中轉站負責給elasticsearch輸出資訊。

1 安裝logstash

這裡使用和elasticsearch相同的版本2.3.4,wget https://download.elastic.co/logstash/logstash/logstash-2.3.4.tar.gz由於logstash有壓縮包,免安裝的,下載後直接解壓。tar -xzvf logstash-2.3.4.tar.gz進入logstash目錄,我們先來看看logstash的外掛集合,bin/logstash-plugin list

圖沒截完,後面還有很多,從名字可以看到有codec、filter、input、output等,這些都是有用的。等號我們講到啟動時帶的config就會用到這些外掛。先看一個logstash-codec-json-lines,這個是必須的,如果早期的版本裝完logstash後沒有這個外掛,你就需要額外去下載它。我們Springboot的專案日誌就是以json的格式傳給logstash的。

2 配置logstash

OK,別的不管,我們直接執行logstash。bin/logstash
可以看到給的提示,只支援兩個命令,logstash agent ,要注意不同的版本命令是不同的,最新的5.5.1就已經沒有agent了,使用時需要注意看系統給的提示。該版本的logstash啟動命令是logstash agent -f conf/conf。即在logstash agent -f 後面加上你的配置檔案。該配置檔案是不存在的,需要我們自己新增。mkdir config 建立目錄vi config/log_es.conf 建立配置檔案,配置檔名字隨便起
input {
  # For detail config for log4j as input,
  # See: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4567
    codec => json_lines
  }
}
filter {
  #Only matched data are send to output.
}
output {
  # For detail config for elasticsearch as output,
  # See: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html
  elasticsearch {
    action => "index"          #The operation on ES
    hosts  => "localhost:9200"   #ElasticSearch host, can be array.
    index  => "applog"         #The index to write data to.
  }
}
這個就是一個簡單的配置檔案,看input、filter、output,這些都是在plugin list裡出現過的,我這裡用的tcp,代表日誌的來源是以tcp的形式過來的。比較常用的有file,就是讀取某個檔案,如果你的日誌是生成了日誌檔案,就可以在這裡用input file去讀取它。還有http、jdbc、kafka、redis等,都有人用,就是把日誌丟到kafka中,logstash去獲取。

filter是過濾器,可以在這裡配置過濾哪些日誌。
output標籤也有很多,代表logstash要把接收到的日誌往哪裡輸出,有stdout輸出到控制檯、email、csv、elasticsearch等。我們選擇把日誌輸出到ES。看配置檔案,設定ES的host為本機,當然你也可以選擇遠端的ES伺服器,可以設定多個ES地址陣列;index代表ES上的index,如果沒有則建立該index;action為index代表動作,分別有“index”、“delete”、“create”、“update”。
你也可以輸出到多個地方,譬如既插入ES又輸出到控制檯
output{  
  elasticsearch{  
    hosts=>["172.132.12.3:9200"]  
    action=>"index"  
    index=>"applog"  
    #document_type=>"%{@type}"  
    document_id=>"ignore"  
    }  
  stdout{  
      codec=>rubydebug  
  }  
}  
index也可以動態指定,如果大家還記得上一篇kibana新增index時就是可以新增*匹配的index。譬如我們可以用
index=>”applog-%{+YYYY,MM.dd}” 
OK,設定完配置檔案,我們就要啟動logstash了。bin/logstash agent -f config/log_es.conf啟動完成後,就可以在Springboot專案裡通過ip:4567埠來輸出日誌到logstash了,logstash收到的日誌就會自動往ES裡插入了。

3 logback日誌關聯logstash

Springboot專案預設logback記錄日誌,之前已經詳細講過了logback的使用。當然你也可以使用log4j、log4j2,它們同樣可以輸出到logstash裡。新建Springboot專案,只勾選個web即可,logback和logstash關聯需要依賴一個元件
<dependency>
			<groupId>net.logstash.logback</groupId>
			<artifactId>logstash-logback-encoder</artifactId>
			<version>4.11</version>
		</dependency>

在pom.xml新增這個,然後在GitHub上看看用法 https://github.com/logstash/logstash-logback-encoder在專案的文件裡可以看到各種用法,裡面有講logback通過socket、tcp等方式將日誌輸出到logstash的。
參照文件,我們在專案裡新建logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />

    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>你的ip地址:4567</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>

    <root level="INFO">
        <appender-ref ref="LOGSTASH" />
        <appender-ref ref="CONSOLE" />
    </root>


</configuration>
配置好ip和logstash的配置檔案input裡你設定的埠。

4 使用kibana檢視Springboot日誌

上面配置好了logback和logstash的關聯,我們就試著輸出日誌看看。
@RestController
public class IndexController {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @GetMapping("/index")
    public Object index() {
        for (int i = 0; i < 100; i++) {
            logger.debug("debug" + i);
            logger.info("info" + i);
            logger.warn("warn" + i);
            logger.error("error" + i);
        }

        return "success";
    }
}
啟動專案,訪問index。然後看看日誌儲存情況


我們可以看到在kibana裡和ES中都已經發現了這些日誌資訊了。譬如我們做個條件搜尋:

OK,通過這個簡單的例子,我們就可以把Springboot日誌輸出到ELK日誌平臺了。