搭建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

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" } } } }
說明:
- index_patherns: 以 springcloud-json-log-開頭的索引均會應用此模板
- order: 模板的優先級,數字越大優先級越高,避免模板沖突
- number_of_shards: 索引使用的分片數量
- number_of_replicas: 索引的副本數,當你需要導入大量數據,第一次建立索引時,可以設置為0,提高寫入速度,導入完成后可以動態修改
- refresh_interval: 向臨時空間刷寫的頻率,類似於硬盤的 fsync
- index: true:字段可用於搜索, false: 不能用於搜索
查看已創建的模板
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
-
輸入"
springcloud-json-log-*"
模糊匹配日志索引,注意,這里如果沒有對應日志,是創建不了的
-
選擇
logtimeUTC
字段作為排序時間,最后點擊創建即可。
-
-
在dashboard面板查看日志
點開dashboard后,選擇剛才創建的index pattern "springcloud-json-log-*"
查看
左下方可以選擇需要查看的字段,本人選擇了Time
,loglevel
,service
,logbody
,其中Time字段為剛才選擇的logtimeUTC
字段
可以根據Time
字段進行時間排序,
可以選擇時間范圍進行查看,一般范圍是15分鍾
在該基礎上可以搭建監控平台
參考資料:
Spring Cloud構建微服務架構:分布式服務跟蹤(整合logstash)
芋道 ELK(Elasticsearch + Logstash + Kibana) 極簡入門
優化es index patterns 和 kibana 多余字段
how-to-apply-grok-filter-for-json-logs-to-from-filebeat-in-logstash