當前位置:
首頁 > 最新 > 使用ELK管理SpringBoot日誌

使用ELK管理SpringBoot日誌

當我們開發一個新項目的時候,一個經常遇到的問題是日誌的管理。ELK棧(Elastic,Logstash,Kibana)是一個功能強大且免費的日誌管理解決方案。在本文中,將為您展示如何安裝、如何設置ELK,如何使用它來管理SpringBoot應用程序中的默認格式的日誌。

在本文中,我們設置了一個演示SpringBoot應用程序,並且啟用了日誌管理,同時使用Logstash配置把日誌條目送到了Elasticsearch。

應用程序會把日誌存在一個文件中。Logstash將讀取並解析日誌文件並將日誌條目發送給Elasticsearch實例。最後,我們將使用Kibana 4(Elasticsearch Web前端)來搜索和分析日誌。

步驟一、安裝Elasticsearch

下載Elasticsearch,下載地址:https://www.elastic.co/downloads/elasticsearch

解壓縮到一個路徑(解壓縮)運行Elasticsearch(bin/elasticsearch或bin/elasticsearch.bat在Windows上)

檢查它是在使用curl -XGET http://localhost:9200運行

下面是如何操作(下面步驟是為OSX編寫的,但其它操作系統大致相同)

現在,Elasticsearch應該已經在運行中了。您可以使用curl命令來驗證。在單獨的終端窗口中執行Elasticsearch狀態頁面的GET請求:

如果一切正常,你應該得到以下結果:

步驟二、安裝Install Kibana 04

下載Kibana,下載地址:https://www.elastic.co/downloads/kibana (請注意你的系統屬性,下載與你系統相匹配的版本,鏈接給出的是OSX系統的)

解壓縮文件

運行Kivana(bin/kibana)

通過把瀏覽器指向Kibana"s來檢查它是否在運行

下面是具體的做法:

將你的瀏覽器指向http://localhost:5601(如果頁面顯示正常,說明我做的很好,我們將在稍後配置它)。

步驟三、安裝Logstash

下載Logstash,下載地址:https://www.elastic.co/downloads/logstash

提取文件(解壓縮)

步驟四、配置Spring Boot的日誌文件

為了讓Logstash傳遞文件到Elasticsearch,我們必須先配置Spring Boot來把日誌條目存儲到一個文件中。我們將建立以下傳遞路徑:Spring Boot App —— 日誌文件 —— Logstash —— Elasticsearch。

這裡還有其它的方法可以完成同樣的事情,比如配置logback來使用TCP附加器把日誌發送到一個遠程的Logstash,以及其它的有些配置。但我更喜歡文件方法,因為這樣更簡單、很自然(你可以很容易的把它添加到已存在的系統中),並且當Logstash停止工作或者Elasticearch宕機的時候,不會丟失或者破壞任何文件。

不管如何,讓我們來配置Spring Boot的日誌文件。最簡單的方法是在application.properties中配置日誌文件。添加下面一行就足夠了:

現在,Spring Boot將會在application.log中記錄ERROR,WARN和INFO級別的信息,並且當信息量達到10M的時候更迭。

步驟五、配置Logstash

通過配置Logstash可以了解SpringBoot的日誌文件格式。這部分比較棘手。

我們需要創建一個Logstash配置文件。典型的Logstash配置文件包含三個部分:input、filter、output。每個部分包含執行相關部分處理的插件,例如:從文件中讀取日誌時間的文件輸入插件,或者將日誌時間發送到Elasticsearch的elasticseatch輸出插件。

input部分定義了Logstash從哪裡讀取輸入數據——在我們的例子中它是一個文件,所以我們將使用一個file插件multiline codec。這基本上意味著我們的輸入文件可能每個條目有多行。

Input 部分

下面是輸入部分的配置:

我們將會用到file插件。

type被設置為java——這只是額外的元數據,以備將來使用多種類型的日誌文件。

path是日誌文件的絕對路徑。它必須是絕對的——Logstash對這點很嚴格。

我們使用multiline codec意味著多個行可能對應著一個日誌事件。

為了檢測在邏輯上與前一行分組的行,我們使用檢測模式:

pattern => "^%-%-% %.*" 每個新的日誌事件都需要以日期開始。

negate => "true" 如果它不以日期開始......

what => "previous" ...然後,它應該與前一行分組。

文件輸入插件,就像配置的一樣,將會跟蹤日誌文件(例如:只讀取文件末尾的新條目)。所以,測試的時候,為了讓Logstash讀取某些內容,您需要生成新的日誌條目。

Filter 部分

Filter 部分包含對日誌時間執行中間處理的插件。在我們的例子中國,事件可以是根據上述規則分組的單個日誌行貨多行日誌事件。在Filter部分,我們會做幾件事情:

如果一個日誌事件包含堆棧跟蹤,我們會標記它。這將有助於我們在後面尋找我們所期望的信息。

解析出時間戳,日誌等級,pid,線程,類名稱(記錄器實際)和日誌信息。

指定時間戳的區域和格式——Kibana將會用到它來進行實踐的基本搜索。

上面提及的Spring Boot日誌格式的過濾器部分看起來是這樣的:

filter {

#If log line contains tab character followed by "at" then we will tag that entry as stacktrace

if [message] =~ " at" {

grok {

match => ["message", "^( at)"]

add_tag => ["stacktrace"]

}

}

#Grokking Spring Boot"s default log format

grok {

match => [ "message",

"(?%-%-% %) % % --- [(?[A-Za-z0-9-]+)] [A-Za-z0-9.]*.(?[A-Za-z0-9#_]+)s*:s+(?.*)",

"message",

"(?%-%-% %) % % --- .+? :s+(?.*)"

]

}

#Parsing out timestamps which are in timestamp field thanks to previous grok section

date {

match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss.SSS" ]

}

}

說明

if [message] =~ "at"如果消息包含後面跟著at的tab字元(這是ruby語法),那麼......

...使用grok插件來標記堆棧蹤跡:

match => ["message", "^(at)"] 當message匹配行的開頭,後面跟著tab,之後跟著at,然後是...add_tag => ["stacktrace"]...用stacktrace標籤標記事件。

使用grok插件進行常規的Spring Boot日誌消息解析:

第一種模式提取時間戳,級別,pid,線程,類名(實際上是記錄器名稱)和日誌消息。

不幸的是,某些日誌消息沒有類似於類名的記錄器名稱(例如,Tomcat日誌),因此第二個模式將跳過記錄器/類欄位並解析出時間戳,級別,pid,線程和日誌消息。

使用date插件解析並設置事件日期:

match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss.SSS" ] timestamp欄位(早先grokked)包含指定格式的時間戳

Output 部分

Output部分包含將事件數據發送到特定目標的輸出插件。產出是事件管道的最後階段。我們將把日誌事件發送到stdout(控制台輸出,用於調試)和Elasticsearch。

與Filter分相比,Output部分非常簡單:

filter {

#If log line contains tab character followed by "at" then we will tag that entry as stacktrace

if [message] =~ " at" {

grok {

match => ["message", "^( at)"]

add_tag => ["stacktrace"]

}

}

#Grokking Spring Boot"s default log format

grok {

match => [ "message",

"(?%-%-% %) % % --- [(?[A-Za-z0-9-]+)] [A-Za-z0-9.]*.(?[A-Za-z0-9#_]+)s*:s+(?.*)",

"message",

"(?%-%-% %) % % --- .+? :s+(?.*)"

]

}

#Parsing out timestamps which are in timestamp field thanks to previous grok section

date {

match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss.SSS" ]

}

}

說明:

我們正在使用多個輸出:stdout和elasticsearch。

stdout { ... } stdout插件將日誌事件列印到標準輸出(控制台)。

codec => rubydebug 使用類似JSON格式的漂亮列印事件。

elasticsearch { ... } elasticsearch插件將日誌事件發送到Elasticsearch伺服器。

host => "127.0.0.1" Elasticsearch所在的主機名 在我們的例子中是localhost。

Update 5/9/2016:在編寫此更新時,Logstash的elasticsearch輸出插件的最新版本使用hosts配置參數,而不是host上面的示例中所示。新參數將一組主機(例如elasticsearch cluster)作為值。換句話說,如果您正在使用最新的Logstash版本,請按如下所示配置elasticsearch輸出插件:


最後,三個部分——input,filter和output需要複製粘貼到一起並保存在Logstash.conf配置文件中。一旦配置文件就位,並且Elasticsearch運行,我們可以運行Logstash:

如果一切順利,Logstash正在傳遞日誌時間到Elasticsearch。

步驟六、配置Kibana

現在是我們再次訪問Kibana web UI的時候了,我們已經在第二部中啟動了,它應該在http:// localhost:5601上運行。

首先,您需要將Kibana指向您選擇的elasticsearch索引。Logstash創建索引的名稱模式是:logstash-YYYY.MM.DD。在Kibana設置——索引中配置索引。

索引包含基於時間的事件(選擇此項)

使用事件時間創建索引名稱(選擇此項)

索引模式間隔:日

索引名稱或模式:[logstash-] YYYY.MM.DD

點擊「創建索引」

現在,點擊「Discover」標籤。在我看來,「Discover」選項卡在Kibana中的確命名不正確 - 它應該被標記為「Search」而不是「Discover」,因為它允許您執行新的搜索並保存/管理它們。日誌事件現在應該顯示在主窗口中。

如果不是,則再次檢查屏幕右上角的時間段過濾器。默認表格默認有2列:Time和_source。為了使列表更有用,我們可以配置顯示的列。從左側的選擇菜單中選擇級別,類別和日誌消息。

好的!您現在已準備好使用ELK堆棧來控制日誌,並開始自定義和調整日誌管理配置。

您可以從這裡下載這篇文章時使用的示例應用程序:

ttps://github.com/knes1/todo。它已被配置為將日誌寫入文件,並具有上述的Logstash配置(儘管需要調整絕對路徑logstash.conf)。

如果你覺得本文有價值,

記得分享給更多人哦!

本公眾號有償徵稿

若您有與Java相關的:

面試、解決方案等文章歡迎投稿

一經採用,將按文章質量給予稿費

掃碼上方二維碼關註:【Java這點事】


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 編程特種部隊 的精彩文章:

TAG:編程特種部隊 |