利用elk进行日志提取分析。
安装elasticsearch
创建一个内网组,方便其他组件之间直接通过内网访问,比如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标签
-d:后台运行
--net:加入内网组
9200用于外部通讯,基于http协议,程序与es的通信使用9200端口。
9300jar之间就是通过tcp协议通信,遵循tcp协议,es集群中的节点之间也通过9300端口进行通信。
discovery.type:使用单机模式
elasticsearch:7.12.0:镜像名加标签
启动后可以使用命令测试
curl http://localhost:9200/
出现如下结果表示安装成功
安装logstash
创建pipeline文件logstash.conf,放在c:\pipeline目录下,内容如下
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:根据正则表达式对日志内容进行分段分词,定义参照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:一次性启动,关闭时会删除容器,若想后台运行可改为-d
挂载目录:
/c/pipeline/:/usr/share/logstash/pipeline/
/c/logs/:/tmp/logs/
若启动出错,可能是由于挂载目录失败,docker destop需要进行如下配置,将C盘根目录加入Resources的FILE SHARING列表中。
启动成功后控制台会打印解析完成的信息
若出现中文乱码,说明log文件不是utf-8格式的
并且也可以直接使用API在es中查询
先用curl http://localhost:9200/_cat/indices?v找到index
然后查询index中的数据curl http://localhost:9200/logstash-2021.04.14-000001/_search
可以看到数据已经写入es了,程序可以使用REST API进行查询。
安装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信息,可以进行条件查询或者全文搜索。