利用elk進(jìn)行日志提取分析。
安裝elasticsearch
創(chuàng)建一個內(nèi)網(wǎng)組,方便其他組件之間直接通過內(nèi)網(wǎng)訪問,比如logstash和kibana等。
docker network create elk-net
啟動Elasticsearch:
docker run -d --name elasticsearch --net elk-net -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.12.0
注意:elasticsearch不支持lastest標(biāo)簽
-d:后臺運行
--net:加入內(nèi)網(wǎng)組
9200用于外部通訊,基于http協(xié)議,程序與es的通信使用9200端口。
9300jar之間就是通過tcp協(xié)議通信,遵循tcp協(xié)議,es集群中的節(jié)點之間也通過9300端口進(jìn)行通信。
discovery.type:使用單機模式
elasticsearch:7.12.0:鏡像名加標(biāo)簽
啟動后可以使用命令測試
curl http://localhost:9200/
出現(xiàn)如下結(jié)果表示安裝成功

安裝logstash
創(chuàng)建pipeline文件logstash.conf,放在c:\pipeline目錄下,內(nèi)容如下
input {
file {
path => "/tmp/logs/t-monitor-error.log"
start_position => "beginning"
type => monitor
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:time} \| %{GREEDYDATA:thread} \| %{LOGLEVEL:level} \| %{GREEDYDATA:class} \| %{GREEDYDATA:logstr}" }
}
}
output {
elasticsearch { hosts => ["elasticsearch:9200"] }
stdout { codec => rubydebug }
}
path:需要讀取的日志文件,為容器中的目錄,可以掛載宿主機目錄
type:自定義
grok:根據(jù)正則表達(dá)式對日志內(nèi)容進(jìn)行分段分詞,定義參照Patern
output:輸出到es和控制臺,因為加入同一個network,所以可以直接用容器名訪問。
日志文件t-monitor-error.log放到c:\logs目錄下
啟動:
docker run --rm -it --network elk-net -v /c/pipeline/:/usr/share/logstash/pipeline/ -v /c/logs/:/tmp/logs/ --name logstash logstash:7.12.0
rm:一次性啟動,關(guān)閉時會刪除容器,若想后臺運行可改為-d
掛載目錄:
/c/pipeline/:/usr/share/logstash/pipeline/
/c/logs/:/tmp/logs/
若啟動出錯,可能是由于掛載目錄失敗,docker destop需要進(jìn)行如下配置,將C盤根目錄加入Resources的FILE SHARING列表中。
啟動成功后控制臺會打印解析完成的信息
若出現(xiàn)中文亂碼,說明log文件不是utf-8格式的
并且也可以直接使用API在es中查詢
先用curl http://localhost:9200/_cat/indices?v找到index
然后查詢index中的數(shù)據(jù)curl http://localhost:9200/logstash-2021.04.14-000001/_search
可以看到數(shù)據(jù)已經(jīng)寫入es了,程序可以使用REST API進(jìn)行查詢。
安裝kibana
docker run -d --name kibana --network elk-net -p 5601:5601 kibana:7.12.0
打開kibana瀏覽器頁面http://localhost:5601/
配置Index patterns為logstash*

配置完成后,就可以在discover中看到log信息,可以進(jìn)行條件查詢或者全文搜索。