前言
上一代的日誌分析系統springboot+log4j+flume+kafka
彷彿還是昨天,現在已經流行起了新一代的springboot2+logback+logstash+elasticsearch
的日誌分析系統,藉助es強大的生態圈以及全文搜索能力,實現日誌收集/分析/檢索不再是難事。
日誌收集分爲兩種情況:
- (本文)
logback直接輸出到logstash
,通過Tcp/Socket等傳輸(網絡開銷),當量太大時Logstash會做一個緩存隊列處理,減少了filebeat去讀取抓取日誌的步驟。 - logback輸出日誌到日誌文件,
filebeat實時抓取日誌文件
(性能開銷),再傳輸到logstash。
第二種情況的舊版flume方案就存在很大的缺點
:在日誌的產生端LogServer服務器重,部署FlumeAgent,然後實時監控產生的日誌,再發送至Kafka。每一個FlumeAgent都佔用了較大的系統資源,有時候LogServer性能開銷大,CPU資源尤其緊張,所以實時收集分析日誌,就必須交給一個更輕量級
、佔用資源更少
的日誌收集框架,例如filebeat
。
什麼是ELK?
從功能
上看,ElasticSearch負責數據的存儲和檢索,Kibana提供圖形界面便於管理,Logstash是個日誌中轉站負責給ElasticSearch輸出信息。
從流程
上看,Logstash收集AppServer產生的Log,並存放到ElasticSearch集羣中,而Kibana則從ES集羣中查詢數據生成圖表,再返回給Browser。
Logstash部分
下載&安裝logstash
- logstash可以從以下地址下載,logstash和elasticsearch的版本要匹配,因爲我們用的es是6.8.1,所以這裏用了6.8.1的logstash,如果你是7.3.0則用7.3.0對應起來即可。
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.1.tar.gz
- 這個包無論是windows或者linux都可用,解壓即用
- (Linux下)cd到logstash目錄下的bin目錄,輸入
sh ./logstash -e 'input { stdin { } } output { stdout {} }'
,輸入任意命令測試是否成功,這是標準手動輸入輸出模式。
配置logstash
- 進入bin目錄,
copy
一份logstash-sample.conf文件並重命名爲到logstash.conf
(或者直接新建一個logstash.conf文件),修改爲以下內容(先註釋掉elasticsearch部分,查看控制檯是否輸出,判斷logback->logstash是否生效!!!
):
# Logback -> Logstash -> Elasticsearch pipeline.
# by zhengkai.blog.csdn.net
input {
tcp {
host => "127.0.0.1"
port => 9250
mode => "server"
tags => ["tags"]
codec => json_lines
}
}
output {
#控制檯直接輸出
stdout{
codec => rubydebug
}
#可以註釋掉elasticsearch部分,查看控制檯是否輸出,判斷logback->logstash是否生效,@zhengkai.blog.csdn.net
elasticsearch {
hosts => ["127.0.0.1:9200"]
action => "index"
index => "mylog"
}
}
- 修改
pipelines.yml
文件
- pipeline.id: test
pipeline.workers: 1
pipeline.batch.size: 1
#config.string: "input { stdin { } } output { stdout {} }"
path.config: "/SWDTOOLS/logstash-6.8.1/config/logstash.conf"
運行logstash
.bat(windows) ,logstash.sh(linux)
補充一點,output配置中的ElasticSearch部分是通過logstash-output-elasticsearch
插件的方式實現的,鏈接是官方插件手冊,可供查詢詳細配置 https://www.elastic.co/guide/en/logstash/6.8/plugins-outputs-elasticsearch.html
ElasticSearch部分
ElasticSearch下載和運行
ElasticSearch
關於es部分,可以之前的文章pringBoot2整合ElasticSearch(包含ElasticSearch入門+spring-boot-starter-data-elasticsearch)
- 下載
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.1.zip
,當然如果太慢可以自己換aria2下載,(另外,如果從官網https://www.elastic.co/cn/downloads/elasticsearch下載Elasticsearch,下載到的版本太新,7.X可能存在兼容性問題,最好Logstash和ElasticSearch一樣都是6.8.1
版本) - 進入
/bin
目錄,chmod +x elasticsearch 進
行授權 - 無需額外配置,可以以默認配置運行
- 運行
./elasticsearch -d
即可(Ubuntu直接運行 sh elasticsearch 會報錯,在Windows下運行 elasticsearch.bat 則沒問題)
moshow@moshow-ThinkCentre-M900:~/Development/Environment/elasticsearch-6.8.1/bin$ sh elasticsearch
elasticsearch: 17: elasticsearch: source: not found
elasticsearch: 1: elasticsearch: : Permission denied
elasticsearch: 21: elasticsearch: Bad substitution
- 打開http://localhost:9200/驗證是否成功
{
"name" : "bOUWfou",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "l0CZWkdcTdCo6pZFO_jU4A",
"version" : {
"number" : "6.8.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "1fad4e1",
"build_date" : "2019-06-18T13:16:52.517138Z",
"build_snapshot" : false,
"lucene_version" : "7.7.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
SpringBoot&Logback部分
Maven依賴
- https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder 建議使用版本5.2以上的,版本過低會有兼容性問題(例如
ERROR in net.logstash.logback.appender.LogstashTcpSocketAppender[stash] - Unable start disruptor java.lang.NoSuchMethodError
)
<!-- https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
Logback TCP Appenders配置
- 可以到官方github文檔 https://github.com/logstash/logstash-logback-encoder 搜一下
TCP Appenders
部分 - 參照文檔,我們在項目的resources目錄裏面裏新建
logback.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>127.0.0.1:9250</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>
Controller
- (Suggest)使用lombok的
@Slf4j
註解,可以直接log.info()/log.error()
調用slf4j進行輸出 - (不建議)或者使用原生
private final Logger log = LoggerFactory.getLogger(getClass());
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class DemoController {
@GetMapping
public Object index(){
String msg="Oh My God ,System Error when "+ DateUtil.now();
log.error(msg);
return ResponseEntity.ok(msg);
}
}
- 查看Logstash控制檯輸出情況
LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError問題
- es無法連接情況,多數是es不可用或者有代理之類的情況:
Kibana部分
下載&安裝
-
wget或者aria2c下載6.8.1版的Kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.1-linux-x86_64.tar.gz
-
解壓文件
tar -xzf kibana-6.8.1-linux-x86_64.tar.gz
-
進入kibana的bin目錄,運直接
./bin/kibana
-
建立一個新
IndexPatten
,Filter選擇時間戳即可 -
查看已經建立的
index patten
,Time Filter by Timestamp,時間過濾器按照指定的時間段展示搜索結果。設置了 index contains time-based events 和 time-field 的索引模式可以使用時間過濾器。
Index Patten索引模式
要使用Kibana,就需要通過配置一個或多個索引模式來告訴它您想探索的 Elasticsearch 索引(相當於創建es連接)。創建連接之後可以:
- 在
Discover
中以交互方式探索您的數據。 - 在
Visualize
中以圖表,表格,儀表,標籤雲等形式顯示數據。 - 在
Canvas
演示文稿中展示您的數據。 - 如果您的數據包含地理數據,請使用地圖
Maps
將其可視化。
另外,
- 如果您的索引中含有一個
時間戳
字段,並且您想將這個字段用於執行基於時間比較的操作,請選擇 索引含有帶時間戳的事件 選項,Kibana 會讀取索引映射並列出包含時間戳的所有字段,從中選擇您需要的字段即可(例如@TimeStamp)。 - 默認情況下,Kibana 會
限制
基於時間
的索引模式的通配符擴展
,(因爲這意義不大,且浪費時間,儘量用正常的比較操作)符,範圍爲當前選定時間內的索引數據。點擊“當搜索時不要展開索引模式”選項來禁用此行爲(即不走時間索引)。
Discover數據探索模塊
數據探索(Discover)
頁面負責交互式地探索es數據:
- 可以訪問與選定索引模式匹配的每個索引中的每個文檔。
- 可以提交搜索請求、過濾搜索結果、查看文檔數據。
- 還可以看到與搜索查詢匹配的文檔數,並獲取字段值的統計信息。
- 如果索引模式中配置了時間字段,您還可以在這個頁面的頂部看到基於時間分佈的文檔數量柱狀圖。
Timelion時序控件
時序控件(Timelion)是一款時間序列數據可視化工具,它可以將多種獨立的數據源合併呈現到一張視圖上。它是由一個簡單的表達式語言驅動的,用來檢索時間序列數據,執行計算得出複雜問題的答案,並可視化結果。
Timelion 可以讓您輕鬆獲得如下問題的答案:
- 過去某段時間頁面的 UV 量是多少?
- 本週五和上週五的流量有多少差異?
- 本站今天來自日本的訪客佔多少百分比?
- 標普500指數過去10天的移動平均值是多少?
- 過去兩年所有的搜索請求總量有多少?
更多詳情可以訪問官方使用手冊 https://www.elastic.co/guide/cn/kibana/current/timelion-create.html
.es(index=metricbeat-*, timefield='@timestamp', metric='avg:system.cpu.user.pct')
效果演示
- 打開 http://localhost:9999/logstash/ ,看到
Oh My God ,System Error when 2019-08-10 18:35:00
的返回信息。
- 查看Logstash控制檯,發現stdout輸出以及沒有es報錯提示。
- 用插件elasticsearch-head查看ElasticSearch,默認連接地址
localhost:9200
,看到日誌傳輸成功
- 進入Kibana的Discover模塊進行搜索 http://localhost:5601/app/kibana#/discover
後言
關於探索Kibana更多功能可以查看官方的中文手冊 https://www.elastic.co/guide/cn/kibana/current/index.html