收集和分析日誌是應用開發中至關重要的一環,網際網路大規模、分布式的特性決定了日誌的源頭越來越分散,
產生的速度越來越快,傳統的手段和工具顯得日益力不從心。在規模化場景下,grep、awk 無法快速發揮作用,我們需要一種高效、靈活的日誌分析方式,可以給故障處理,問題定位提供更好的支援。基於全文搜尋引擎 lucene 構建的 elkstack 平台,是目前比較流行的日誌收集方解決方案。
結合logstash,elasticsearch和kibana三個元件,可以搭建一套高效的日誌收集和分析系統。
elk stack支援元件間的靈活組合,提供強大的開箱即用的日誌收集和檢索功能。
可以看到elk系統進行日誌收集的過程可以分為三個環節:
logstash可以結合redis或者kafka等收集應用伺服器產生的日誌,經過簡單的過濾等操作後傳送到elasticsearch,elasticsearch進行相關的索引處理,最後在kibana進行相關的視覺化操作。
logstash 是一種功能強大的資訊採集工具,類似於同樣用於日誌收集的 flume。
logstash通過配置檔案規定 logstash 如何處理各種型別的事件流,一般包含 input、filter、output 三個部分。
logstash 為各個部分提供相應的外掛程式,通過 input、filter、output 三類外掛程式完成各種處理和轉換,
另外 codec 類的外掛程式可以放在 input 和 output 部分通過簡單編碼來簡化處理過程。
logstash使用jruby語言編寫,對於使用者來講,logstash本身是基於命令列介面,面向任務處理的。
logstash的軟體架構是一種帶有「管道-過濾器」風格的外掛程式式架構,作為乙個開源軟體,logstash遵循apache 2.0
進行開源,第三方社群為其貢獻了大量外掛程式。
這張資料流圖來自官方社群,可以看到logstash的執行時資料處理會經歷三個階段:
三個階段的處理任務是非同步的,不存在跨階段任務執行與同乙個執行緒中的情況。
logstash可以通過指定配置檔案直接啟動,下面是乙份典型的配置示例:
# 讀取access.log日誌並輸出到控制台elasticsearch是乙個開源搜尋伺服器專案,2023年2月發布至今,該專案已發展成為搜尋和資料分析解決方案領域的主要一員。es的實現和應用包括非常多的內容,這裡我們只簡單了解,從整體架構入手,做到對es有乙個初步的認識。input
}output
}
elasticsearch基於apache lucene實現,lucene是乙個成熟的、高效能並且可擴充套件的搜尋引擎包, elasticsearch在lucene之上封裝了索引,查詢,以及分布式相關的介面。
節點是集群中的乙個 elasticearch 例項。 集群是一組擁有共同的 cluster name 的節點。其中乙個節點就是乙個 es 程序,多個節點組成乙個集群。一般每個節點都執行在不同的作業系統上,配置好集群相關引數後 es 會自動組成集群。集群內部通過 es 的選主演算法選出主節點,而集群外部則是可以通過任何節點進行操作,無主從節點之分,對外表現對等,去中心化,有利於客戶端程式設計。
索引在es中索引有兩層含義, 作為動詞,它指的是把乙個文件儲存到 es 中的過程,索引乙個文件後,我們就可以使用 es 搜尋到這個文件; 作為名詞,它是指儲存文件的地方,相當於關聯式資料庫中的database概念,乙個集群中可以包含多個索引。
es 是乙個分布式系統,它儲存索引時會選擇適合的「主分片」(primary shard),把索引儲存到其中(我們可以把分片理解為一塊物理儲存區域)。分片的分法是固定的,而且是安裝時候就必須要決定好的(預設是 5),後面就不能改變了。
既然有主分片,那肯定是有「從」分片的,在 es 裡稱之為「副本分片」(replica shard)。副本分片主要有兩個作用: 高可用:某分片節點掛了的話可走其他副本分片節點,節點恢復後上面的分片資料可通過其他節點恢復 負載均衡:es 會自動根據負載情況控制搜尋路由,副本分片可以將負載均攤
es支援restful訪問,並且 es 的 http 介面不只是可以進行業務操作(索引/搜尋),還可以進行一些配置等。
下面介紹幾個很常用的介面:
我們也可以直接在所有索引所有型別上進行搜尋:/_search。/_cat/nodes?v:查集群狀態
/_cat/shards?v:檢視分片狀態
/$/$/_search:搜尋
除了上面這些,es官方社群還給出了一些關鍵術語解釋:
乙個文件就是乙個儲存在 es 中的 json 文字,可以把它理解為關係型資料庫表中的一行。每個文件都是儲存在索引中的,擁有一種型別和 id。乙個文件是乙個 json 物件(一些語言中的 hash / hashmap / associative array)包含了 0 或多個字段(鍵值對)。原始的 json 文字在索引後將被儲存在 _source 欄位裡,搜尋完成後返回值中預設是包含該字段的。
id 是用於標識文件的,乙個文件的索引/型別/id 必須是唯一的。文件 id 是自動生成的(如果不指定)。
乙個文件包含了若干字段,或稱之為鍵值對。欄位的值可以是簡單(標量)值(例如字串、整型、日期),也可以是巢狀結構,例如陣列或物件。乙個字段類似於關係型資料庫表中的一列。每個欄位的對映都有乙個字段型別(不要和文件型別搞混了),它描述了這個字段可以儲存的值型別,例如整型、字串、物件。對映還可以讓我們定義乙個欄位的值如何進行分析。
乙個對映類似於關係型資料庫中的模式定義。每個索引都存在乙個對映,它定義了該索引中的每一種型別,以及索引相關的配置。對映可以顯示定義,或者在文件被索引時自動建立。
elasticsearch的應用場景主要發揮其強大的全文搜尋功能,因為良好的分布式支援,一些公司也會使用es作為文件型資料庫,類似mongodb等的應用。
kibana應用在elasticsearch之上,提供視覺化的資料查詢和分析等功能, 主要的版本有kibana 3和kibana 4,兩者在設計上區別較大,這裡主要介紹k4的應用。
要使用kibana,就得告訴它想要探索的 elasticsearch 索引是那些,需要配置乙個或者多個索引模式。 預設情況下,kibana 認為你要訪問的是通過 logstash 匯入 elasticsearch 的資料,這時候使用預設的 logstash-* 作為index pattern。 kibana 資料展示需要乙個包含了時間戳的索引字段,用來做基於時間的處理,如果是由logstash匯入的日誌,使用預設的@timestamp即可。
連線到elasticsearch以後,就可以使用kibana進行資料的分析。
kibana的面板支援以下的功能:
discover 標籤頁用於互動式探索資料。可以訪問到匹配得上選擇的索引模式的每個索引的每條記錄。可以提交搜尋請求,過濾搜尋結果,然後檢視文件數 據。還可以看到匹配搜尋請求的文件總數,獲取字段值的統計情況。如果索引模 式配置了時間字段,文件的時序分布情況會在頁面頂部以柱狀圖的形式展示出來。
kibana支援lucene格式的檢索方式。包括:
(1)簡單的文字搜尋,直接輸入文字字串。
比如,如果在搜尋**伺服器日誌,可以輸入exception來搜尋各字段中的exception單詞。
(2)搜尋特定欄位中的值,
搜尋特定欄位中的值,則在值前加上欄位名。比如,可以輸入 status:200 來限制搜尋,要搜尋乙個值的範圍,可以用範圍查詢語法,
(3)使用連線條件進行複雜搜尋
要指定更複雜的搜尋標準,可以用布林操作符and, or和 not 。
visualize 標籤頁用來設計視覺化。 支援各種圖表進行展示。
kibana dashboard 能支援自由排列一組已儲存的檢視。然後可以儲存這個儀表板,用來分享或者過載。
(1)建立新的儀錶盤
第一次點選 dashboard 標籤的時候,kibana 會顯示乙個空白的儀表板。 通過新增視覺化的方式來構建儀表板。
要新增檢視到儀表板上,點選工具欄面板上的 add。從列表中選擇乙個已儲存的檢視。可以在 visualization filter 裡輸入字串來過濾想要找的檢視。 你選擇的這個檢視會出現在儀表板上的乙個容器(container)裡。
(2)修改儀錶盤資訊
儀表板裡的視覺化都存在可以調整大小的容器裡,點選容器右上角的 edit 按鈕在 visualize 頁開啟視覺化編輯。
蜂巢APP對接ELK統一日誌
docker compose的方式對接elk 1 一鍵部署docker和docker compose環境 docker容器簡介 一鍵部署指令碼 bin bash sudo yum config manager add repo sudo yum makecache fast sudo yum y i...
統一日誌處理
日誌是幹啥的.不多說.這裡只記錄怎麼配置日誌.logger 日誌記錄器.可以配置不同的日誌級別.不同的級別顯示的日誌資訊不同的.越往後的日誌級別會包含前面所有日誌級別顯示的資訊 off,fatal,error,warn,info,debug,all loggin.level.root warn這是 ...
統一日誌框架
常見的框架有log4j log4j2 logback 如果乙個專案中整合元件有單獨的框架那麼日誌配置就很混亂 log4j log4j2是沒有實現slf4j門面的 logback是實現的 就是我們獲取logger的包 是從slf4j獲取的 將我們自己的日誌框架通過slf4j實現 如果是log4j通過s...