docker-compose搭建ELK+filebeat读取springboot项目日志
1、日志框架介绍
1.1 日志门面 (日志的抽象层)
SLF4j(Simple Logging Facade for Java)
1.2 日志实现
Logback
1.3 日志级别
日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出
1.4 logback多环境配置
为了能让springProperty的配置生效,需要把logback.xml 修改成 logback-spring.xml
2、ELK介绍
2.1 Elasticsearch
分布式搜索引擎。具有高可伸缩、高可靠、易管理等特点。可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 是用Java 基于 Lucene 开发,现在使用最广的开源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基于它来构建自己的搜索引擎。在elasticsearch中,所有节点的数据是均等的。
2.2 Logstash
数据收集处理引擎。支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储以供后续使用。
2.3 Kibana
可视化化平台。它能够搜索、展示存储在 Elasticsearch 中索引数据。使用它可以很方便的用图表、表格、地图展示和分析数据。
2.4 Filebeat
轻量级数据收集引擎。相对于Logstash所占用的系统资源来说,Filebeat 所占用的系统资源几乎是微乎及微。它是基于原先 Logstash-fowarder 的源码改造出来。换句话说:Filebeat就是新版的 Logstash-fowarder,也会是 ELK Stack 在 Agent 的第一选择。
3、虚拟机一:部署elasticsearch和kibana(单机版)
3.1 准备虚拟机(CentOS-7-x86_64-DVD-2009.iso)
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
设置固定ip
cd /etc/sysconfig/network-scripts
ll
vim ifcfg-ens33
修改(有的修改,没有的添加)
BOOTPROTO=static
IPADDR="192.168.10.20"
NETMASK="255.255.255.0"
GATEWAY="192.168.10.1"
DNS1="114.114.114.114"
注:NETMASK与图中子网掩码一致
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dzxc00Cf-1690981690017)(src/main/resources/images/静态IP网关设置.png)]
重启网关
systemctl restart network
3.2 编写elasticsearch和kibana的docker-compose文件
version: '3.1'
services:
elasticsearch:
image: elasticsearch:7.6.2
container_name: elasticsearch
ports:
- 9200:9200
environment:
- "cluster.name=elasticsearch"
- "discovery.type=single-node"
- "ES_JAVA_OPTS=-Xms256m -Xmx256m"
- "ELASTIC_PASSWORD=ZhengJinWei123!"
- "xpack.security.enabled=true"
volumes:
- ./plugins/:/usr/share/elasticsearch/plugins/
- ./data/:/usr/share/elasticsearch/data/
kibana:
image: kibana:7.6.2
container_name: kibana
ports:
- 5601:5601
depends_on:
- elasticsearch
environment:
- "elasticsearch.hosts=http://elasticsearch:9200"
- "ELASTICSEARCH_USERNAME=elastic"
- "ELASTICSEARCH_PASSWORD=ZhengJinWei123!"
3.3 汉化kibana
进入容器&打开文件
docker exec -it kibana bash
cd config
vi kibana.yml
编辑文件
server.name: kibana
server.host: "0.0.0.0"
# IpAddress:docker inspect es查看es容器内部的ip地址
elasticsearch.hosts: [ "http://{IpAddress}:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.username: "elastic"
elasticsearch.password: "ZhengJinWei123!"
i18n.locale: "zh-CN"
退出&重启
exit
docker restart kibana
4、虚拟机二:部署logstash(单机版)
4.1 配置静态IP
192.168.10.27
4.2 编写logstash的docker-compose文件
version: '3.1'
services:
logstash:
image: logstash:7.6.2
container_name: logstash
ports:
- 9600:9600
- 5044:5044
environment:
- TZ=Asia/Shanghai
- LS_JAVA_OPTS=-Xmx256m -Xms256m
volumes:
#挂载logstash的配置文件
- ./config/logstash.yml:/usr/share/logstash/config/logstash.yml
- ./config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
4.3 修改config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.enabled: true
#docker的物理ip
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.10.20:9200" ]
#es的用户密码
xpack.monitoring.elasticsearch.username: "elastic"
xpack.monitoring.elasticsearch.password: "ZhengJinWei123!"
elasticsearch的用户密码需要手动执行命令,也可在compose里使用command
ssl.certificate_authority 复制es的证书到容器里,使用数据卷挂载出来
ca_trusted_fingerprint 第一次启动es的时候在日志里有打印
4.4 修改pipeline/logstash.conf
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["192.168.10.20:9200"]
# 自定义字段
index => "demo-%{+YYYY.MM.dd}"
user => "elastic"
password => "ZhengJinWei123!"
}
#控制台输出,方便调试
stdout {}
}
5、虚拟机三:部署springboot项目和filebeat
5.1 配置静态IP
192.168.10.28
5.2 编写filebeat的docker-compose文件
version: '3.1'
services:
filebeat:
container_name: filebeat
image: elastic/filebeat:7.6.2
volumes:
#挂载日志输出路径
- /usr/local/logs:/var/log/filebeat/logs
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml
- ./data:/usr/share/filebeat/data
ports:
- 9000:9000
5.3 修改filebeat.yml
output.logstash:
# The Logstash hosts
hosts: ["192.168.10.27:5044"]
# output.elasticsearch:
# hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}'
# username: '${ELASTICSEARCH_USERNAME:}'
# password: '${ELASTICSEARCH_PASSWORD:}'
filebeat.inputs:
- type: log
paths:
# docker 容器里的日志位置
- /var/log/filebeat/logs/*.log
multiline:
pattern: '^[[:space:]]+(at|\.{3})[[:space:]]+\b|^Caused by:'
negate: false
match: after
timeout: 5s