docker-ELK
ELK/EFK简介
E(Elasticsearch)+L(Logstash)+K(Kibana)
E(Elasticsearch)+F(Filebeat)+K(Kibana)
Redis/Mq/kafka大数据高提高弹性时候可选
graph LR B(beats数据采集)-.->G([redis/mq/kafka])-.->L[Logstash数据管道/处理]-->E[Elasticsearch数据存储/索引]-->K[Kibana数据分析/显示] B-->L
Logstash
输入支持:tcp,http,file,beats,kafka,rabbitmq,redis,log4j,elasticsearch,jdbc,websocket
过滤器支持:grok,ruby,mutate,json
输出支持:elasticsearch,File,Emial,http,Kafka,Redis,MongoDB,Rabbitmq,Syslog,Tcp,Websocket,Zabbix,Stdout,Csv
Filebeat vs fluent
Filebeat主要用于数据采集,轻量对应用服务器消耗较小,虽然Logstash也可以采集数据,但Logstash占用应用服务器性能比Filebeat大
fluent是Filebeat的高级版,支持很多其他日志输入模式
springboot log框架包
- /logstash-logback-encoder Star 1.7k
- /logback-kafka-appender Star 472
- /logback-more-appenders Star 87
- kmtong/logback-redis-appender Star 103
架构选型
方案一 EFK(docker log模式)
利用Filebeat采集docker日志,从而监控docker上所有或指定服务的日志,实现SpringCloud的日志监听
优点: 对现有服务侵入无,不需要改造现有服务
缺点:强依赖于docker,只能监听docker
graph LR B(Filebeat收集docker日志)-->E[Elasticsearch]-->K[Kibana]
方案二 Logstash采用
优点:简洁,搭建快速
缺点:没缓冲,可能会有瓶颈
graph LR B(Logstash收集本地log文件)-->E[Elasticsearch]-->K[Kibana]
方案三 Logstash+redis+Logstash(未验证)
参考:搭建 ELK 实时日志平台并在 Spring Boot 和 Nginx 项目中使用
优点:
- 直接读取日志文件,对原来的系统入侵无,
- 支持所有服务,例如nginx,springboot等只要能生成日志文件的
缺点:
- 需要在读取日志文件的服务器都安装Logstash(shipper角色)
- 采用docker部署的时候,springboot需要映射日志目录
graph LR B(Logstash收集本地log文件/Shipper)--写入-->G([redis])--读取-->L[Logstash/Indexer角色]-->E[Elasticsearch]-->K[Kibana]
方案四 kafka+logstash(未验证)
参考:Spring Cloud集成ELK完成日志收集实战(elasticsearch、logstash、kibana
优点:
- 不需要在应用服务器安装额外的服务
- 支持docker部署,不需要额外映射服务目录
缺点:
- 需要改造springboot
- 不支持nginx、数据库等服务
graph LR B(springboot)--写入-->G([kafka])--读取-->L[Logstash]-->E[Elasticsearch]-->K[Kibana]
方案五 EFK+logback-more-appenders
参考:sndyuk/logback-more-appenders
优点:直接通过jar集成logback框架,干净
缺点:只适合于springboot
graph LR A(springboot依赖logback-more-appenders)-->B(fluent)-->E[Elasticsearch]-->K[Kibana]
步骤:
Docker安装
fluent
,fluent镜像需要自己制作exxk/fluent-elasticsearch:latest
参考fluentd/container-deployment/docker-compose1
2
3
4
5# fluentd/Dockerfile
FROM fluent/fluentd:v1.6-debian-1
USER root
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-document", "--version", "3.5.2"]
USER fluentspringboot引入maven依赖
1
2
3// https://mvnrepository.com/artifact/com.sndyuk/logback-more-appenders
compile group: 'com.sndyuk', name: 'logback-more-appenders', version: '1.4.2'
compile group: 'org.fluentd', name: 'fluent-logger', version: '0.3.4'springboot在logback.xml添加fluentd的日志输出模式(具体见logback的配置)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<!--EFK ip -->
<springProperty scope="context" name="fluentHost" source="logback.fluent.host" />
<!--EFK 端口 -->
<springProperty scope="context" name="fluentPort" source="logback.fluent.port" />
<!--FLUENT输出 -->
<appender name="FLUENT"
class="ch.qos.logback.more.appenders.FluentLogbackAppender">
<tag>${APP_NAME}</tag>
<label>logback</label>
<remoteHost>${fluentHost}</remoteHost>
<port>${fluentPort}</port>
<layout>
<pattern>${LOG_FORMAT}</pattern>
</layout>
</appender>动态配置
application
1
2
3spring.cloud.config.logback-profile=FLUENT
logback.fluent.host=${LOGBACK_FLUENT_HOST:xxx.cn}
logback.fluent.port=${LOGBACK_FLUENT_PORT:14021}然后运行springboot触发日志
然后去页面配置见日志EFK框架中elastic的配置使用
EFK/ELK部署
docker-stack.yml
内容如下
1 | version: '3.3' |
各个配置文件配置内容如下:
elastic_config
1 |
|
kibana_config
1 |
|
logstash_config
1 |
|
logstash_pipeline
1 | input { |
filebeat_config
1 | filebeat.config: |
fluent_config
1 | # fluentd/conf/fluent.conf |