日誌分析的必要性
- 日誌可以為我們提供關於系統行為的必要資訊。然而,每個不同的服務,或者同一個系統中不同的元件中,日誌的內容和格式都可能是不同的
- 正因為日誌的內容是多樣化的,它們的用處才能體現出來,例如,日誌可以用來排查故障、執行簡單的狀態檢查或者生成報表,而
Web
伺服器日誌則可以用來分析跨多個產品之間的流量模式。通過電子商務網站的日誌可以分析出某個特定位置發出的包裹是否被頻繁地退回,還能分析出可能的原因是什麼 - 下面是一些使用日誌分析的常見用例
- 問題除錯
- 效能分析
- 安全分析
- 預測分析
- 物聯網(
IoT
)日誌
問題除錯
- 在應用程式中開啟日誌最常見的理解之一。除錯日誌最簡單和最頻繁的用法是查詢特定的錯誤訊息或者發生的事件
- 一旦
bug
或者問題被定位,日誌分析解決方案可以幫助捕獲應用的資訊,並且提供問題發生時的日誌快照給開發團隊用於後續的深入分析
效能分析
- 日誌分析有助於優化或者除錯系統的效能往往是在瞭解系統中如何使用資源。日誌可以幫助分析系統中單個資源的使用情況、應用程式中的多執行緒行為,以及潛在的死鎖條件等
例如,可以通過Web伺服器日誌中的響應時間和HTTP響應程式碼來了解每個服務的情況等
安全分析
- 對任何組織來說,日誌都可以在應用安全的管理中起到關鍵的作用,特別有助於檢測安全漏洞、應用程式濫用、惡意攻擊等
預測分析
- 近年來的研究熱點之一。日誌和事件資料可用於非常準確的預測分析。預測分析模型有助於識別潛在客戶、規劃資源、管理和優化庫存、提升工作負載和資源排程的效率。它有助於指導營銷策略、使用者人群定向、廣告投放策略等
物聯網日誌
- 當涉及到物聯網裝置時,對系統進行監測和管理,以保持停機時間最短,並快速解決任何重大
bug
問題來說,日誌是非常關鍵的
日誌分析的挑戰
- 目前的日誌分析過程主要是檢查在多個伺服器上的日誌,這些日誌是應用程式中不同的元件和系統所記錄的。分析日誌是一個既費時又煩瑣的工作
- 不一致的日誌格式
- 離散的日誌
- 專業知識的需求
不一致的日誌格式
- 每一個應用或者裝置都有自己記錄日誌的格式,每種格式都需要各自的專家才能解讀。並且在不同格式的日誌之間進行搜尋也是非常困難的
離散的日誌
- 應用程式中,日誌往往分佈在不同的伺服器和不同的元件中。多個元件在多個位置記錄日誌,增加了日誌分析的複雜性
ELK
技術棧
ELK
平臺是一個完整的日誌分析解決方案,ELK
使用了開源技術棧讓Elasticsearch
用於深度搜尋和資料分析;Logstash
用於日誌集中管理,包括從多臺伺服器上傳輸和轉發日誌,並對日誌進行豐富和解析;最後是Kibana
,提供了強大而美觀的資料視覺化。ELK
技術棧目前主要由Elastic
公司維護和支援
Elasticsearch
- 是一個基於
Apache Lucene
的分散式開源搜尋引擎,使用Apache2.0
開源協議釋出(意味著可以免費下載、使用或者修改)。它在Lucene
的實時搜尋之外提供了可擴充套件性、可靠性和多租戶功能。Elasticsearch
的功能可以通過基於JSON
的RESTfulAPI
來使用 - 很多大公司都使用了
Elasticsearch
,包括Github
、SoundCloud
、FourSquare
、Netflix
,以及很多其他著名的公司。下面例舉一些典型的使用者案例
Wikipedia:使用es提供文字本文搜尋,以及一些產品功能,如一邊輸入一邊搜尋和搜尋建議
Github:使用es對超過800萬行程式碼庫和跨平臺事件進行索引,以便提供實時搜尋的功能
es
的關鍵特性包括
- 它是一個開源的分散式、可擴充套件和高可用的實時文件儲存
- 提供了實時搜尋和分析的能力
- 提供了複雜的
RESTful API
,包括查詢和其他各種功能,如批量搜尋、地理位置搜尋、自動完成、上下文搜尋建議和結果片段等 - 能夠很簡單地進行水平擴充套件,也很容易和其他雲基礎設施如
AWS
等整合
Logstash
- 是一個資料管道,主要用來收集、解析和分析大量結構化和非結構化的資料以及各種系統產生的事件。
Logstash
提供了輸入外掛來支援不同的資料來源和平臺,設計用來高效地處理日誌、事件和非結構化資料來源,然後通過輸出外掛如檔案、標準輸出(如輸出到執行Logstash
的控制檯)或者es
等輸出結果資料 Logstash
關鍵特性
- 集中化的資料處理:
Logstash
通過資料管道,可以集中化地處理資料。使用不同的輸入和輸出外掛,可以將各種不同的輸入源轉換成一種單一的能用格式 - 支援自定義日誌格式:不同應用生成的日誌通常有不同的特殊格式。
Logstash
可以分析和處理大規模的自定義格式的日誌。Logstash
自帶了很多開箱即用的過濾外掛,也支援使用者編寫自定義的外掛 - 外掛開發:可以開發和釋出自定義外掛。實際上現在已經有很多可用的自定義外掛
Kibana
- 是一個基於
Apache2.0
開源協議的開源資料視覺化平臺。它可以對儲存於es
的索引中的各種結構化和非結構化的資料進行視覺化呈現 Kibana
關鍵特性如下
- 它為商業智慧提供了一個靈活的分析和視覺化平臺
- 它提供了實時分析、彙總、圖表和除錯的能力
- 提供了一個直觀且使用者友好的介面,並且是高度可定製的,可以根據需要對圖表進行拖放和對齊
- 可以管理多個儀表盤,並且能夠儲存。儀表盤可以在多個系統中分享和嵌入
- 可以分享日誌搜尋結果的快照,可以隔離不同的問題處理過程
ELK
資料管道
- 一個典型的
ELK
技術棧的資料管道看起來如下圖所示
- 在典型的
ELK
技術棧的資料管道中,多個應用伺服器上的日誌通過Logstash
採集器傳輸到一個集中化的索引器中,索引器將處理後的資料結果輸出到es
叢集,然後Kibana
通過查詢es
叢集中的日誌資料建立儀表盤,做視覺化展現
Elasticsearch
es
配置檔案一般放在安裝目錄下的config
目錄中。有兩個檔案,分別是elasticsearch.yml
和logging.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
最常見的形式
Message
:包含完整的輸入資訊或者事件@timestamp
:包含事件被索引的時間。如果使用了日期過濾外掛,也可能是message
中的某個指定事件時間的欄位Host
:通常來說表示事件的主機
Logstash
的檔案輸入外掛
例如讀取Apache日誌檔案作為輸入,然後輸出到標準輸出
input {
file {
type => "apache"
path => "/user/packpub/intro-to-elk/elk.log"
}
output {
stdout { codec => rubydebug }
}
}
Logstash
的Elasticsearch
輸出外掛
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
外掛
- 常用外掛有三類
- 輸入外掛
- 過濾外掛
- 輸出外掛
輸入外掛
File
:從日誌檔案中讀取事件流Redis
:從redis
例項中讀取事件流Stdin
:從標準輸入讀取事件流Syslog
:通過網路從syslog
訊息中讀取事件流Ganglia
:通過udp
網路讀取ganglia
包中的事件流Lumberjack
:使用lumberjack
協議讀取事件流Eventlog
:從Windows
事件日誌中讀取事件流S3
:從亞馬遜s3
儲存桶的檔案中讀取事件流Elasticsearch
:從elasticsearch
叢集的搜尋結果中讀取事件流
過濾外掛
Date
:從流入的事件中解析日期欄位作為Logstash
的timestamp
欄位Drop
:從流入的事件中拋棄符合特定過濾條件的所有資料Grok
:非常強大的過濾外掛,可以將非結構化的日誌事件解析成結構化的資料multiline
:將同一個輸入源中的多行資料解析為一條日誌事件dns
:將任意指定的欄位解析為IP
地址mutate
:可以重新命名、刪除、修改或者替換事件中的任意欄位geoip
:根據Maxmind IP
資料庫,將IP
欄位解析出地理位置相關的資訊
輸出外掛
file
:將事件寫入到磁碟上的檔案中e-mail
:在接收到輸出時,根據某些特定的條件傳送郵件elasticsearch
:將輸出資料儲存到es
叢集中stdout
:將事件寫入標準輸出redis
:將事件寫入到redis
的佇列作為代理mongodb
:將輸出資訊寫入mongodb
kafka
:將事件寫入kafka
的主題
Kibana
- 配置檔案在
cofnig
目錄下
config/kibana.yml
port: 5601
host: “localhost”
elasticsearch_url: localhost:9200
介面
- 探索
- 視覺化
- 儀表盤
- 設定
探索
- 互動式地檢視符合所選的索引模式的資料。可提交搜尋查詢、過濾搜尋結果並檢視文件資料
視覺化
- 基於不同的資料來源,比如新的交換式搜尋、已儲存搜尋,或者其他已經存在的視覺化部件,來建立新的視覺化部件
儀表盤
- 儲存在不同組的視覺化部件的集合
本作品採用《CC 協議》,轉載必須註明作者和本文連結