需求分析
日誌是作爲線上系統排錯的關鍵,通常我們在本機代碼調試的時候,錯誤會直接打印在控制檯上,因此我們才能進行錯誤的判斷。當系統運行在線上的時候,如果單純的通過捕獲異常 ,使用**e.printStackTrace()**進行打印肯定是不行的。因爲其他的運行信息或者異常也會將打印的信息給頂掉。
這個時候我們就需要引入日誌系統了,這裏就不在贅述如何打印日誌了。
上述這種情況是在單機版的情況下正常運行,這個時候我們的日誌是可以正常的進行查看。但是,當我們開始做分佈式,做微服務的時候,單機版的日誌系統對於這種情況就不適用了。、
此時此刻,日誌記錄在多個服務器的log文件當中,而對於我們來說排錯就變得異常困難了。因爲一個服務可能做了集羣之後,生成的日誌文件還需要去查看在哪個服務器,對於開發的排錯來說大大降低了效率。
顯然,此時此刻我們需要一個分佈式的日誌管理系統,對所有的日誌進行統一的管理。
分佈式日誌系統ELK是指Elasticsearch+Logstash+Kibana。Elasticsearch是一個開源的全文檢索工具用於日誌存儲,Logstash是一個日誌收集工具。Kibana用於日誌查詢與展示。下面是系統簡單架構圖。
ELK的架構體系十分的簡單,首先Logstash通過讀取數據源中的數據,進行過濾,然後在輸出到ElasticSearch當中去。接着使用Kibbna進行日誌的查看。
Logstash的數據源及輸出源是多種多樣的,數據源可以有Redis,日誌文件,數據庫等,輸出源也一樣。在這裏我們以文件爲案列進行講解。
環境準備
軟件 | 版本 |
---|---|
elasticsearch | 6.7.0 |
kibana- | 6.7.0 |
logstash | 6.7.0 |
注意:這裏使用的所有版本都是Windows系統下的,並非Linux系統。
ElasticSearch啓動
在解壓縮後的elasticsearch-6.7.0目錄下找到bin/elasticsearch.bat雙擊啓動即可,無需改動任何配置。如遭遇到內存大小不夠等其他原因可自行百度解決。
可以訪問http://localhost:9200/,出現下列JSON代表啓動成功!
{
"name" : "MjlzdTX",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "EgG3WpR8QxqVrGqidCbB-A",
"version" : {
"number" : "6.7.0",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "8453f77",
"build_date" : "2019-03-21T15:32:29.844721Z",
"build_snapshot" : false,
"lucene_version" : "7.7.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
Kibana啓動
在啓動Kibana之前,需要修改yml文件,選擇你需要監聽的ElasticSearch的端口號。
打開kibana-6.7.0-windows-x86_64\config下的kibana.yml文件,找到下面這段代碼取消註釋。
# The URLs of the Elasticsearch instances to use for all your queries.
elasticsearch.hosts: "http://localhost:9200"
修改完成後只需要訪問kibana-6.7.0-windows-x86_64\bin下的kibana.bat文件,雙擊啓動。
接着訪問http://localhost:5601,如果進入下面頁面代表啓動成功
Logstash啓動
這裏以https://grouplens.org/datasets/movielens/的
文件爲例子,點擊下載存放到自己的磁盤當中去。
在logstash-6.7.0\bin的目錄下新建一個conf文件,命名爲stdin.conf文件。文件內容如下:
input {
file {
path => ["F:/data/ml-latest-small/movies.csv"]
start_position => "beginning"
sincedb_path => "nul"
}
}
filter {
csv {
separator => ","
columns => ["id","content","genre"]
}
mutate {
split => { "genre" => "|" }
remove_field => ["path", "host","@timestamp","message"]
}
mutate {
split => ["content", "("]
add_field => { "title" => "%{[content][0]}"}
add_field => { "year" => "%{[content][1]}"}
}
mutate {
convert => {
"year" => "integer"
}
strip => ["title"]
remove_field => ["path", "host","@timestamp","message","content"]
}
}
output {
elasticsearch {
hosts => "http://localhost:9200"
index => "movies"
document_id => "%{id}"
}
stdout {}
}
input爲之前所講述的數據源,file/path爲文件路徑。修改爲剛纔所下載的csv文件所在地址。output爲輸出源,filter爲你要存儲在ElasticSearch中的格式,這裏放在後面在贅述,先以環境的搭建爲主。
注意,我在這裏的index是
index => “movies”
如果使用的是我的elk軟件包,最好重命名一下,索引名隨意
在你的logstash-6.7.0\bin目錄下啓動cmd命令,輸入以下指令
logstash -f stdin.conf
啓動成功後
Kibana查看
打開之前登陸的Kibana頁面,找到管理的索引模式,創建剛纔的索引(movies)。
接着就可以在這裏查看剛纔所插入的信息
當然你也可以通過下面的開發者工具使用Es的命令進行搜索。
小結
elk的整體搭建其實並不是很困難,按着步驟就能走下來。這篇文章主要是爲了初學者進行elk的搭建,後續會講如何對日誌進行處理。 以及elk+redis+filebeat進行更深度的優化。