《Learning ELK Stack》1 ELK技術棧介紹

yeedomliu發表於2020-07-30

日誌分析的必要性

  • 日誌可以為我們提供關於系統行為的必要資訊。然而,每個不同的服務,或者同一個系統中不同的元件中,日誌的內容和格式都可能是不同的
  • 正因為日誌的內容是多樣化的,它們的用處才能體現出來,例如,日誌可以用來排查故障、執行簡單的狀態檢查或者生成報表,而Web伺服器日誌則可以用來分析跨多個產品之間的流量模式。通過電子商務網站的日誌可以分析出某個特定位置發出的包裹是否被頻繁地退回,還能分析出可能的原因是什麼
  • 下面是一些使用日誌分析的常見用例
  1. 問題除錯
  2. 效能分析
  3. 安全分析
  4. 預測分析
  5. 物聯網(IoT)日誌

問題除錯

  • 在應用程式中開啟日誌最常見的理解之一。除錯日誌最簡單和最頻繁的用法是查詢特定的錯誤訊息或者發生的事件
  • 一旦bug或者問題被定位,日誌分析解決方案可以幫助捕獲應用的資訊,並且提供問題發生時的日誌快照給開發團隊用於後續的深入分析

效能分析

  • 日誌分析有助於優化或者除錯系統的效能往往是在瞭解系統中如何使用資源。日誌可以幫助分析系統中單個資源的使用情況、應用程式中的多執行緒行為,以及潛在的死鎖條件等

例如,可以通過Web伺服器日誌中的響應時間和HTTP響應程式碼來了解每個服務的情況等

安全分析

  • 對任何組織來說,日誌都可以在應用安全的管理中起到關鍵的作用,特別有助於檢測安全漏洞、應用程式濫用、惡意攻擊等

預測分析

  • 近年來的研究熱點之一。日誌和事件資料可用於非常準確的預測分析。預測分析模型有助於識別潛在客戶、規劃資源、管理和優化庫存、提升工作負載和資源排程的效率。它有助於指導營銷策略、使用者人群定向、廣告投放策略等

物聯網日誌

  • 當涉及到物聯網裝置時,對系統進行監測和管理,以保持停機時間最短,並快速解決任何重大bug問題來說,日誌是非常關鍵的

日誌分析的挑戰

  • 目前的日誌分析過程主要是檢查在多個伺服器上的日誌,這些日誌是應用程式中不同的元件和系統所記錄的。分析日誌是一個既費時又煩瑣的工作
  1. 不一致的日誌格式
  2. 離散的日誌
  3. 專業知識的需求

不一致的日誌格式

  • 每一個應用或者裝置都有自己記錄日誌的格式,每種格式都需要各自的專家才能解讀。並且在不同格式的日誌之間進行搜尋也是非常困難的

離散的日誌

  • 應用程式中,日誌往往分佈在不同的伺服器和不同的元件中。多個元件在多個位置記錄日誌,增加了日誌分析的複雜性

ELK技術棧

  • ELK平臺是一個完整的日誌分析解決方案,ELK使用了開源技術棧讓Elasticsearch用於深度搜尋和資料分析;Logstash用於日誌集中管理,包括從多臺伺服器上傳輸和轉發日誌,並對日誌進行豐富和解析;最後是Kibana,提供了強大而美觀的資料視覺化。ELK技術棧目前主要由Elastic公司維護和支援

Elasticsearch

  • 是一個基於Apache Lucene的分散式開源搜尋引擎,使用Apache2.0開源協議釋出(意味著可以免費下載、使用或者修改)。它在Lucene的實時搜尋之外提供了可擴充套件性、可靠性和多租戶功能。Elasticsearch的功能可以通過基於JSONRESTfulAPI來使用
  • 很多大公司都使用了Elasticsearch,包括GithubSoundCloudFourSquareNetflix,以及很多其他著名的公司。下面例舉一些典型的使用者案例

Wikipedia:使用es提供文字本文搜尋,以及一些產品功能,如一邊輸入一邊搜尋和搜尋建議

Github:使用es對超過800萬行程式碼庫和跨平臺事件進行索引,以便提供實時搜尋的功能

  • es的關鍵特性包括
  1. 它是一個開源的分散式、可擴充套件和高可用的實時文件儲存
  2. 提供了實時搜尋和分析的能力
  3. 提供了複雜的RESTful API,包括查詢和其他各種功能,如批量搜尋、地理位置搜尋、自動完成、上下文搜尋建議和結果片段等
  4. 能夠很簡單地進行水平擴充套件,也很容易和其他雲基礎設施如AWS等整合

Logstash

  • 是一個資料管道,主要用來收集、解析和分析大量結構化和非結構化的資料以及各種系統產生的事件。Logstash提供了輸入外掛來支援不同的資料來源和平臺,設計用來高效地處理日誌、事件和非結構化資料來源,然後通過輸出外掛如檔案、標準輸出(如輸出到執行Logstash的控制檯)或者es等輸出結果資料
  • Logstash關鍵特性
  1. 集中化的資料處理:Logstash通過資料管道,可以集中化地處理資料。使用不同的輸入和輸出外掛,可以將各種不同的輸入源轉換成一種單一的能用格式
  2. 支援自定義日誌格式:不同應用生成的日誌通常有不同的特殊格式。Logstash可以分析和處理大規模的自定義格式的日誌。Logstash自帶了很多開箱即用的過濾外掛,也支援使用者編寫自定義的外掛
  3. 外掛開發:可以開發和釋出自定義外掛。實際上現在已經有很多可用的自定義外掛

Kibana

  • 是一個基於Apache2.0開源協議的開源資料視覺化平臺。它可以對儲存於es的索引中的各種結構化和非結構化的資料進行視覺化呈現
  • Kibana關鍵特性如下
  1. 它為商業智慧提供了一個靈活的分析和視覺化平臺
  2. 它提供了實時分析、彙總、圖表和除錯的能力
  3. 提供了一個直觀且使用者友好的介面,並且是高度可定製的,可以根據需要對圖表進行拖放和對齊
  4. 可以管理多個儀表盤,並且能夠儲存。儀表盤可以在多個系統中分享和嵌入
  5. 可以分享日誌搜尋結果的快照,可以隔離不同的問題處理過程

ELK資料管道

  • 一個典型的ELK技術棧的資料管道看起來如下圖所示

image-20200619005900529

  • 在典型的ELK技術棧的資料管道中,多個應用伺服器上的日誌通過Logstash採集器傳輸到一個集中化的索引器中,索引器將處理後的資料結果輸出到es叢集,然後Kibana通過查詢es叢集中的日誌資料建立儀表盤,做視覺化展現

Elasticsearch

  • es配置檔案一般放在安裝目錄下的config目錄中。有兩個檔案,分別是elasticsearch.ymllogging.yml。前者配置es不同模組的屬性,如網路地址、路徑等,後者則用來配置自身的日誌記錄選項

路徑

  • 指定資料和日誌檔案的路徑
path:
  logs: /var/log/elasticserach
  data: /var/data/elasticsearch

叢集名

  • 指定生產叢集名字,叢集將根據這個名字自動發現和加入節點
cluster:
  name: <name of your cluster>

節點名

  • 指定每個節點的預設名字
node:
  name: <name of your node>

Logstash

bin/logstash -e 'input { stdin{} } output { stdout{} }'
$ logstash -e 'input { stdin{} } output { stdout{} }'
Sending Logstash logs to /usr/local/Cellar/logstash/6.4.2/libexec/logs which is now configured via log4j2.properties
[2020-06-19T01:09:49,205][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2020-06-19T01:09:49,726][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"6.4.2"}
[2020-06-19T01:09:51,358][INFO ][logstash.pipeline        ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>12, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2020-06-19T01:09:51,463][INFO ][logstash.pipeline        ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0x6e7affd run>"}
The stdin plugin is now waiting for input:
[2020-06-19T01:09:51,512][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2020-06-19T01:09:51,918][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
abc
{
      "@version" => "1",
    "@timestamp" => 2020-06-18T17:09:58.696Z,
          "host" => "YEEDOMLIU-MB12",
       "message" => "abc"
}
bin/logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug } }'
$ logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug } }'
Sending Logstash logs to /usr/local/Cellar/logstash/6.4.2/libexec/logs which is now configured via log4j2.properties
[2020-06-19T01:11:09,563][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2020-06-19T01:11:10,091][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"6.4.2"}
[2020-06-19T01:11:11,905][INFO ][logstash.pipeline        ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>12, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2020-06-19T01:11:12,060][INFO ][logstash.pipeline        ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0x3b0f0f77 run>"}
The stdin plugin is now waiting for input:
[2020-06-19T01:11:12,101][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2020-06-19T01:11:12,334][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
hello baby
{
       "message" => "hello baby",
      "@version" => "1",
          "host" => "YEEDOMLIU-MB12",
    "@timestamp" => 2020-06-18T17:17:13.873Z
}
  • 上面輸出資訊是Logstash最常見的形式
  1. Message:包含完整的輸入資訊或者事件
  2. @timestamp:包含事件被索引的時間。如果使用了日期過濾外掛,也可能是message中的某個指定事件時間的欄位
  3. Host:通常來說表示事件的主機

Logstash的檔案輸入外掛

例如讀取Apache日誌檔案作為輸入,然後輸出到標準輸出

input {
  file {
    type => "apache"
    path => "/user/packpub/intro-to-elk/elk.log"
  }
  output {
    stdout { codec => rubydebug }
  }
}

LogstashElasticsearch輸出外掛

bin/logstash -e 'input { stdin{} } output { elasticsearch{ host = localhost } }'

配置Logstash

  • Logstash的配置檔案使用的是JSON格式,可通過-flag引數指定配置檔案的路徑,甚至可以是一個包含多個不同型別如輸入、過濾和輸出外掛的配置檔案的目錄
bin/logstash -f ../conf/logstash.conf

如果希望在執行前測試配置檔案的語法錯誤,可以執行如下命令:bin/logstash -configtest ../conf/logstash.conf上述命令只檢查配置檔案,而不是真正地執行logstash

Logstash外掛

  • 常用外掛有三類
  1. 輸入外掛
  2. 過濾外掛
  3. 輸出外掛

輸入外掛

  1. File:從日誌檔案中讀取事件流
  2. Redis:從redis例項中讀取事件流
  3. Stdin:從標準輸入讀取事件流
  4. Syslog:通過網路從syslog訊息中讀取事件流
  5. Ganglia:通過udp網路讀取ganglia包中的事件流
  6. Lumberjack:使用lumberjack協議讀取事件流
  7. Eventlog:從Windows事件日誌中讀取事件流
  8. S3:從亞馬遜s3儲存桶的檔案中讀取事件流
  9. Elasticsearch:從elasticsearch叢集的搜尋結果中讀取事件流

過濾外掛

  1. Date:從流入的事件中解析日期欄位作為Logstashtimestamp欄位
  2. Drop:從流入的事件中拋棄符合特定過濾條件的所有資料
  3. Grok:非常強大的過濾外掛,可以將非結構化的日誌事件解析成結構化的資料
  4. multiline:將同一個輸入源中的多行資料解析為一條日誌事件
  5. dns:將任意指定的欄位解析為IP地址
  6. mutate:可以重新命名、刪除、修改或者替換事件中的任意欄位
  7. geoip:根據Maxmind IP資料庫,將IP欄位解析出地理位置相關的資訊

輸出外掛

  1. file:將事件寫入到磁碟上的檔案中
  2. e-mail:在接收到輸出時,根據某些特定的條件傳送郵件
  3. elasticsearch:將輸出資料儲存到es叢集中
  4. stdout:將事件寫入標準輸出
  5. redis:將事件寫入到redis的佇列作為代理
  6. mongodb:將輸出資訊寫入mongodb
  7. kafka:將事件寫入kafka的主題

Kibana

  • 配置檔案在cofnig目錄下

config/kibana.yml

port: 5601

host: “localhost”

elasticsearch_url: localhost:9200

介面

  1. 探索
  2. 視覺化
  3. 儀表盤
  4. 設定

探索

  • 互動式地檢視符合所選的索引模式的資料。可提交搜尋查詢、過濾搜尋結果並檢視文件資料

image-20200619092701636

視覺化

  • 基於不同的資料來源,比如新的交換式搜尋、已儲存搜尋,或者其他已經存在的視覺化部件,來建立新的視覺化部件

儀表盤

  • 儲存在不同組的視覺化部件的集合
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章