搭建ELK日志分析平台的詳細過程


搭建ELK日志分析平台的詳細過程

 

日志分析系統-ELK平台

由於日志文件都離散的存儲在各個服務實例的文件系統之上,僅僅通過查看日志文件來分析我們的請求鏈路依然是一件相當麻煩的差事。 ELK平台,它可以輕松的幫助我們來收集和存儲這些跟蹤日志,同時在需要的時候我們也可以根據Trace ID來輕松地搜索出對應請求鏈路相關的明細日志

ELK平台主要有由ElasticSearch、Logstash和Kiabana三個開源免費工具組成:

  • Elasticsearch是個開源分布式搜索引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
  • Logstash是一個完全開源的工具,他可以對你的日志進行收集、過濾,並將其存儲供以后使用。
  • Kibana 也是一個開源和免費的工具,它Kibana可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助您匯總、分析和搜索重要數據日志。

 

本人下載的均為7.6.2版本

 

 

1.下載elasticsearch

 

 

解壓后, linux平台下運行 bin/elasticsearch命令啟動es (or bin\elasticsearch.bat on Windows)

 

2.下載kibana
解壓后,修改配置config/kibana.yml,設置es

# The URLs of the Elasticsearch instances to use for all your queries.
elasticsearch.hosts: ["http://localhost:9200"]

linux平台下運行bin/kibana啟動 (or bin\kibana.bat on Windows)

啟動后,可以在瀏覽器中訪問http://localhost:5601

 

 

3.下載logstash

解壓后,在config目錄下, 復制配置logstash-sample.conf 為 logstash.conf 配置修改如下:

# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  beats {
    port => 5044
  }
}
filter {
  grok {
    match => [ "message", '{"logtimeUTC":"%{DATA:logtimeUTC}","logtime":"%{DATA:logtime}","loglevel":"%{DATA:loglevel}","service":"%{DATA:service}","traceId":"%{DATA:traceId}","spanId":"%{DATA:spanId}","exportable":"%{DATA:exportable}","pid":"%{DATA:pid}","thread":"%{DATA:thread}","class":"%{DATA:class}","logbody":"%{DATA:logbody}"}']
  }

  mutate {
    remove_field => "message"
  }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "springcloud-json-log-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

 

上面的意思是,由beat發送數據給logstash,然后再發給Elasticsearch

最后, linux平台下運行bin/logstash -f config/logstash.conf啟動logstash


注意事項,上面的

match => [ "message", '{"logtimeUTC":"%{DATA:logtimeUTC}","logtime":"%{DATA:logtime}","loglevel":"%{DATA:loglevel}","service":"%{DATA:service}","traceId":"%{DATA:traceId}","spanId":"%{DATA:spanId}","exportable":"%{DATA:exportable}","pid":"%{DATA:pid}","thread":"%{DATA:thread}","class":"%{DATA:class}","logbody":"%{DATA:logbody}"}']

對應於logback-logstash.xml中的json格式日志,意思是, 將屬性message中的json日志文本,轉成成json屬性,

 

remove_field => "message"

轉換之后移除message屬性

 

index => "springcloud-json-log-%{+YYYY.MM.dd}"

指定了日志存儲入es時,使用的索引模板, 看下面的5.創建索引模板步驟

 

4.下載filebeat
解壓后,修改filebeat.yml配置, 本人配置示例

主要修改如下(摘抄):

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.

- type: log

  # Change to true to enable this input configuration.
  enabled: true  #修改為true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    # /var/log/*.log
    #- c:\programdata\elasticsearch\logs\*
    - /home/timfruit/work/spring-cloud-demo/logs/*.json # 配置我們要讀取的 Spring Boot 應用的日志

#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
  # Array of hosts to connect to.  #去掉輸出到es
  #hosts: ["localhost:9200"]

  # Protocol - either `http` (default) or `https`.
  #protocol: "https"

  # Authentication credentials - either API key or username/password.
  #api_key: "id:api_key"
  #username: "elastic"
  #password: "changeme"

#----------------------------- Logstash output --------------------------------
output.logstash:
  # The Logstash hosts  #啟用輸出到logstash
  hosts: ["localhost:5044"]  

 

注意事項,

- /home/timfruit/work/spring-cloud-demo/logs/*.json # 配置我們要讀取的 Spring Boot 應用的日志

該配置需要修改為自己的日志路徑

 

最后, linux平台下運行./filebeat -e -c filebeat.yml啟動

 

Logstash是基於JVM的重量級工具,可以添加集成輕量級filebeat。
本demo日志收集流程
應用日志 -> filebeat -> logstash -> Elasticsearch -> Kibana
實際生產中,如果日志量每秒鍾很大,寫入es時可能有問題,就需要添加使用消息隊列kafka。
應用日志 -> filebeat -> kafka -> logstash -> Elasticsearch -> Kibana

 

 

5.創建索引模板
在啟動es,kibana之后,訪問kibana http://localhost:5601


kibana_index_template

PUT _template/springcloud-json-log_template
{
  "version": 1,
  "order" : 99,
  "index_patterns": ["springcloud-json-log-*"],

  "settings" : {
    "number_of_shards" : 1,
    "number_of_replicas" : 0,
    "refresh_interval" : "1s"
  },
  "mappings" : {
    "dynamic" : "false",
    "properties" : {
      "logtimeUTC" : {
        "type" : "date",
        "index" : "true"
      },
      "logtime" : {
        "type" : "date",
        "format": "yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",
        "index" : "true"
      },
      "loglevel" : {
        "type" : "text",
        "index" : "true"
      },
      "service" : {
        "type" : "text",
        "index" : "true"
      },
      "traceId" : {
        "type" : "text",
        "index" : "true"
      },
      "spanId" : {
        "type" : "text",
        "index" : "true"
      },
      "exportable" : {
        "type" : "text",
        "index" : "false"
      },
      "pid" : {
        "type" : "text",
        "index" : "false"
      },
      "thread" : {
        "type" : "text",
        "index" : "false"
      },
      "class" : {
        "type" : "text",
        "index" : "false"
      },
      "logbody" : {
        "type" : "text",
        "index" : "false"
      }
    }
  }
}
View Code

 

說明:

  • index_patherns: 以 springcloud-json-log-開頭的索引均會應用此模板
  • order: 模板的優先級,數字越大優先級越高,避免模板沖突
  • number_of_shards: 索引使用的分片數量
  • number_of_replicas: 索引的副本數,當你需要導入大量數據,第一次建立索引時,可以設置為0,提高寫入速度,導入完成后可以動態修改
  • refresh_interval: 向臨時空間刷寫的頻率,類似於硬盤的 fsync
  • index: true:字段可用於搜索, false: 不能用於搜索

 

查看已創建的模板
kibana_index_template_check

 

 

6.配置應用日志,啟動應用輸出日志到logs文件夾 application.yml

# 配置應用名,logback-logstash.xml使用到,輸出的日志名為應用名
spring:
  application:
    name: netflix-account-example
##====================================log config===============================================
logging:
  config: classpath:logback-logstash.xml

 

注意事項,需要添加logback-logstash.xml到resources下,需要添加依賴包

       <!-- elk logstash 日志-->
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>6.3</version>
        </dependency>

 

本demo可以僅啟動兩個應用測試,一是eureka-server,二是mall-account-application

(不使用本人的demo也是可以的,自己可以搭建一個springboot應用,並且配置好日志,運行輸出日志即可)

 

啟動后可以看到logs文件夾下有.json日志


filebeat會讀取日志文件,發送給logstash

 

 

7.通過kibaba查看應用日志

  • 創建index pattern
    創建index pattern步驟1

    • 輸入"springcloud-json-log-*"模糊匹配日志索引,注意,這里如果沒有對應日志,是創建不了的
      創建index pattern步驟2

    • 選擇logtimeUTC字段作為排序時間,最后點擊創建即可。
      創建index pattern步驟3

  • 在dashboard面板查看日志
    點開dashboard后,選擇剛才創建的index pattern  "springcloud-json-log-*" 查看
    左下方可以選擇需要查看的字段,本人選擇了Time,loglevel,service,logbody,其中Time字段為剛才選擇的logtimeUTC字段
    可以根據Time字段進行時間排序,
    可以選擇時間范圍進行查看,一般范圍是15分鍾
    dashboard查看日志步驟

   

  

 

 

 

 

在該基礎上可以搭建監控平台

 

 

 

完整demo源碼

 

參考資料:

Spring Cloud構建微服務架構:分布式服務跟蹤(整合logstash)

芋道 ELK(Elasticsearch + Logstash + Kibana) 極簡入門

優化es index patterns 和 kibana 多余字段

how-to-apply-grok-filter-for-json-logs-to-from-filebeat-in-logstash

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM