m1基于docker的springboot服务+ELK+filebeat日志系统搭建

650 阅读4分钟

吐槽一下

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】显示以下界面说明成功

image.png

kibana

kibana配置简单,访问【v1:5601】会发现kibana的界面很复杂,一下子不知所措。但不需要担心,我们只需要关注日志dashboard,菠萝me!

image.png

1.左边菜单栏 截屏2022-10-03 23.46.36.png 2.点击Dev Tools,输入es整活api【GET /_cluster/healter】, 看到kibana正常连接es,显示正常,到这停止,先别整活了,整logstash去。 image.png

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。

image.png

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

准备了一个简单的测试接口 image.png 到此,v2搭建完毕。下面我偷偷跑了测试接口,并查看服务器上的日志文件,确认日志产生无误!

image.png 此时回到kibana,应该有个index被自动创建了。点击工具栏Stack Management -> Index Management,发现[starter]躺在这里向我们招手!(因为今天是10月3号,我的index做了日期拼接,参照logstash配置文件)

截屏2022-10-04 00.11.15.png

配置日志可视化面板

数据有了,但你看不到,需要配置可视化面板。还是那个页面,点击Index Partterns,按照框框创建统配即可。

截屏2022-10-04 00.14.09.png 然后点击Discover,经过简单筛选字段就能看到日志了,你学费了吗!

截屏2022-10-04 00.16.44.png