吐槽一下
m1苹果用了一年半了,兼容问题就没停止过,应用软件的兼容还好,饭碗软件的兼容真是要命。如果你也跟我一样使用PD搭建虚拟机docker环境,相信你也遇到过docker run failed的情况,今天介绍一个基于m1搭建ELK+filebeat的日志系统,能学习,也能避坑。
环境
虚拟机 两台(v1:10.211.55.5,v2:10.211.55.7)
ES, Logsatsh, Kibana 各一只(v1)
microservice 一只(v2)
filebeat 一只
搭建ELK
开始之前贴一下docker-compose配置文件,再逐一解释每个docker容器的配置
version: '3'
services:
elasticsearch:
image: elasticsearch:7.17.4 #m1兼容问题,选择7.17.4镜象;ELK镜像版本尽量保持一致
container_name: elasticsearch
environment:
- cluster.name=elasticsearch #设置集群名称为elasticsearch
- discovery.type=single-node #以单一节点模式启动
- ES_JAVA_OPTS=-Xms512m -Xmx512m #设置使用jvm内存大小
- TZ=Asia/Shanghai
volumes:
- ./es/plugins:/usr/share/elasticsearch/plugins #分词等插件目录
- ./es/data:/usr/share/elasticsearch/data #数据文件
networks:
- elk
ports:
- 9200:9200
- 9300:9300
kibana:
image: kibana:7.17.4
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200 #kibana通过该地址访问es restful api
- TZ=Asia/Shanghai
depends_on:
- elasticsearch #老生常谈,kibana在elasticsearch启动之后再启动
networks:
- elk
ports:
- 5601:5601
logstash:
image: logstash:7.17.4
container_name: logstash
environment:
- TZ=Asia/Shanghai
- output.elasticsearchhosts
volumes:
- ./logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #logstash配置文件,配置数据来源(filebeat),数据出口(es)
depends_on:
- elasticsearch
networks:
- elk
ports:
- 5044:5044
links:
- elasticsearch
networks:
elk:
driver:
bridge
es
创建两个目录,data和plugins。data目录需要chmod(你懂的),plugins用于存放ik分词器等插件。其他的配置如注释所示。启动之后访问【v1:9200】显示以下界面说明成功
kibana
kibana配置简单,访问【v1:5601】会发现kibana的界面很复杂,一下子不知所措。但不需要担心,我们只需要关注日志dashboard,菠萝me!
1.左边菜单栏
2.点击Dev Tools,输入es整活api【GET /_cluster/healter】, 看到kibana正常连接es,显示正常,到这停止,先别整活了,整logstash去。
logstash
logstash作为日志数据入口和出口,它接受来自filebeat的日志数据,经过内部过滤等操作输出到es。因此配置文件需要配置出口入口地址信息。当前目录创建logstash/logstash.conf文件,文件内容:
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
index => "[starter]-%{+YYYY.MM.dd}" #日志标签,由filebeat设置
}
}
至此v1的elk配置完毕,还等什么,docker-compose一下,待一个五杀的功夫,按照图片所示确认es,kibana正常 ,然后docker logs logstash输出logstash日志,确认能正常连接es。
filebeat
搭建v2开始前说两句废话。以前的ELK是没有杂质,没有filebeat的ELK,microservice所在服务器把日志发送到logstash,但logstash跑在JVM上面,资源消耗比较大,作者后来用go写了轻量级的filebeat,加入到ELK体系。 我们照样使用docker-compose启动filebeat,尤其注意挂载的日志文件,必须是你的microservice产生日志的目录
version: '3'
services:
filebeat:
container_name: filebeat
image: docker.elastic.co/beats/filebeat:7.14.2
volumes:
- /usr/local/docker/filebeat/conf/filebeat.yml:/usr/share/filebeat/filebeat.yml
- /usr/local/docker/jar/logs:/var/elk/logs
配置文件filebeat.yml很重要,确保日志目录正确,logstash地址正确,搭建的时候如果出现es kibana正常,但es查不到日志,大概率是因为这里配置不正确。
# 从日志文件输入日志
filebeat.inputs:
- type: log
enabled: true
paths: #收集的日志目录(容器内)
- /var/elk/logs/error/*.log
- /var/elk/logs/info/*.log
tags: ["starter"] #注意这里的tag,输入的数据会打上标签
exclude_lines: ['^$'] #去除空行
multiline:
type: pattern
pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
negate: true
match: after
setup.template.settings:
# 设置主分片数
index.number_of_shards: 1
# 因为测试环境只有一个es节点,所以将副本分片设置为0,否则集群会报黄
index.number_of_replicas: 0
# 输出到logstash
output.logstash:
# logstash所在服务器的ip和端口
hosts: ["10.211.55.5:5044"]
microservice
准备了一个简单的测试接口
到此,v2搭建完毕。下面我偷偷跑了测试接口,并查看服务器上的日志文件,确认日志产生无误!
此时回到kibana,应该有个index被自动创建了。点击工具栏Stack Management -> Index Management,发现[starter]躺在这里向我们招手!(因为今天是10月3号,我的index做了日期拼接,参照logstash配置文件)
配置日志可视化面板
数据有了,但你看不到,需要配置可视化面板。还是那个页面,点击Index Partterns,按照框框创建统配即可。
然后点击Discover,经过简单筛选字段就能看到日志了,你学费了吗!