ELK日誌系統部署

ELK是ElasticsearchLogstashkibana三個開源庫的首字母縮寫,這三個庫的主要功能分別以下:Elasticsearch用於日誌存儲、分析、搜索等功能;Logstash主要用於收集、修改、傳輸日誌; kibana用於可視化提供友好的數據分析界面。html

本文使用docker搭建一個相對比較簡單ELK日誌系統,本文假設讀者對如下知識有基本的瞭解:nginx

  • SpringBoot
  • Logback
  • Docker(docker-compress)

首先需須要有一個SpringBoot的工程來產生一些日誌,這裏直接延用之前的工程(AppBubbleBackend),若有興趣可查看原文《SpringBoot集成gRPC微服務工程搭建實踐》,工程的搭建和docker想着的知識就不作過多的補充了,本文所提到的ELK配置到放在AppBubbleBackend/scripts/elk目錄下。git

產生日誌(Logback)

示例使用SpringBoot工程集成Logback日誌庫來產生日誌,首先要引用相關信賴:github

<dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </dependency>
    
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
    </dependency>
    
    
    <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
    </dependency>
複製代碼

logback-classiclogback-core是Logback提供的類庫,logstash-logback-encoder提供一些類庫來處理日誌,主要用於格式化Logback的日誌併發送到Logstash服務器。spring

配置好Logback依賴後,SpringBoot會自動使用Logback替換掉的默認日誌系統, 這樣只須要在配置下logstash-logback-encoder將日誌正確的發送的Logstash就能夠了。根據SpringBoot的日誌管理模式在resources目錄下新建一個logback-spring.xml的日誌配置文件內容以下:docker

<configuration>
    <springProperty scope="local" name="appname" source="spring.application.name" defaultValue="undefined"/>

    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>logstash:4560</destination>
        <!-- encoder is required -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder" >
            <customFields>{"appname":"${appname}"}</customFields>
        </encoder>
    </appender>

    <root level="TRACE">
        <appender-ref ref="logstash"/>
    </root>

    <logger name="com.bubble" level="TRACE"/>
    <logger name="com.bubble.user" />
    <logger name="com.bubble.common" />
</configuration>
複製代碼

以上配置文件使用net.logstash.logback.appender.LogstashTcpSocketAppender創建一個Appender,將destination設置爲Logstash服務器的地址,並添加一個自定義參數appname後面再來介紹這個字段。json

配置完依賴和Logback以後,日誌都發送到LogstashTcpSocketAppender,它會處理日誌併發送的Logstash服務器。ruby

收集日誌(Logstash)

上面提到過日誌經過LogstashTcpSocketAppender處理併發送到Logstash服務器,接下來就須要配置一個Logstash來接收日誌。Logstash的配置分爲logstash.ymlpipeline兩類配置,logstash.yml不須要太多的配置咱們使用默認的配置就夠了,pipeline的配置能夠分爲inputfilteroutput兩個主要的配置模塊,它們的主要功能分別爲:input主要用來接收日誌;filter用來修改日誌;output將日誌發送到目的地。bash

logback-spring.xml日誌配置文件中使用的LogstashTcpSocketAppender來發送日誌並配置了Logstash的地址爲logstash:4560因此在pipeline的配置中首先須要添加一個接收日誌的input服務器

input {
    tcp {
        port => 4560
        codec => json_lines
        id => "main"
    }
}
複製代碼

而後在添加一個output將日誌發送到Elasticsearch

output {
   #stdout { codec => rubydebug { metadata => true } }

   elasticsearch {
      hosts => ["elasticsearch:9200"]
      index => "logstash-services-%{+YYYY.MM.dd}"
   }
}
複製代碼

output使用elasticsearch這個插件並指定elasticsearch服務器地址,最後將index的名稱設置logstash-services-%{+YYYY.MM.dd}的格式,這樣index的名稱將會是logstash-services-2019.03.18的形式。

Logstash的配置可參考官方文檔:

存儲日誌(Elasticsearch)

Elasticsearch的配置相對於前面兩個稍微複雜一些,這次主要測試目的直接使用默認的配置。將Elasticsearch啓動後,若是Logstash配置正確就可使用 Get Index API 來獲取index的信息。

查看2019.03.16這條的index信息:

curl http://elasticsearch:9200/logstash-services-2019.03.16
複製代碼

由於在配置logback-spring.xml的時候,添加了一個自定義的參數appname因此能夠經過使用appname來查詢日誌:

curl http://localhost:9200/logstash-*/_search?pretty -X GET -H 'Content-Type: application/json'  -d '{"query":{"match":{"appname":{"query":"AppBubbleUserService"}}}}'

複製代碼

以上命令執行完後可看到相似以下輸出,說明日誌已經成功發送到elasticsearch:

{
        "_index" : "logstash-services-2019.03.18",
        "_type" : "doc",
        "_id" : "6ksRj2kBJ7x4nqLIOHp6",
        "_score" : 0.0011799411,
        "_source" : {
          "thread_name" : "main",
          "@version" : "1",
          "level" : "TRACE",
          "appname" : "AppBubbleUserService",
          "host" : "appbubblebackend_user_1.appbubblebackend_default",
          "port" : 56952,
          "level_value" : 5000,
          "logger_name" : "org.springframework.boot.context.config.ConfigFileApplicationListener",
          "@timestamp" : "2019-03-18T04:31:02.983Z",
          "message" : "Skipped missing config classpath:/application-default.xml for profile default"
        }

複製代碼

分析日誌(kibana)

日誌被成功發送到elasticsearch後就可使用kibana來查看搜索日誌了。添加一個簡單的配置文件:

elasticsearch:
 hosts:
 - "http://elasticsearch:9200"

server:
 name: "kibana"
 host: 0.0.0.0
複製代碼

配置好elasticsearch服務器的地址,而後啓動kibana再添加一個Index Patterns,依次點擊 Management >> Index Patterns >> Create index pattern建立一個index pattern

添加成功進入Discover頁面,在下拉框中選擇新建的index便可看到以下所示的輸出日誌:

kibana還有不少強大的功能,後續再來繼續探索。

總結

使用elk處理分析日誌相比較傳統的日誌處理方式可大大提升日誌的檢索效率,若是要在生產環境中使用還須要更加深刻的學習和詳細的配置方案。後續的學習和使用中會繼續深刻學習ElasticsearchLogstash的相關知識,同時對不於不支持發送遠程日誌的工具後續會使用beats來接入日誌系統, 如envoynginx就可使用filebeat來將日誌發送到Logstash來查看訪問日誌。

資料參考

相關文章
相關標籤/搜索