使用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:編程特種部隊 |