SpringBoot实战电商我的项目mall(35k+star)地址:https://github.com/macrozheng/mall
摘要
ELK
日志收集零碎大家都晓得,然而还有一种日志收集零碎EFK
,必定有很多敌人不晓得!这里的F
指的是Fluentd
,它具备Logstash相似的日志收集性能,然而内存占用连Logstash的十分之一都不到,性能优越、十分笨重。本文将具体介绍Fluentd的应用,次要用来收集SpringBoot利用的日志,心愿对大家有所帮忙!
Fluentd 简介
Fluentd是一款开源的日志收集性能,致力于为用户搭建对立的日志收集层,和Elasticsearch、Kibana一起应用能够搭建EFK日志收集零碎。什么是对立的日志收集层呢?看下上面这张图就分明了!
装置
在《你竟然还去服务器上捞日志,搭个日志收集零碎难道不香么!》中曾经介绍了ELK日志收集零碎的搭建,这里就不再介绍Elasticsearch和Kibana的装置了,间接介绍Fluentd在Docker环境下的装置。
- 下载Fluentd的Docker镜像;
docker pull fluent/fluentd:v1.10
- 将默认配置
fluent.conf
文件复制到/mydata/fluentd/
目录下,配置信息如下:
<source> @type forward @id input1 @label @mainstream port 24224</source><filter **> @type stdout</filter><label @mainstream> <match docker.**> @type file @id output_docker1 path /fluentd/log/docker.*.log symlink_path /fluentd/log/docker.log append true time_slice_format %Y%m%d time_slice_wait 1m time_format %Y%m%dT%H%M%S%z </match> <match **> @type file @id output1 path /fluentd/log/data.*.log symlink_path /fluentd/log/data.log append true time_slice_format %Y%m%d time_slice_wait 10m time_format %Y%m%dT%H%M%S%z </match></label>
- 运行Fluentd服务,须要凋谢
24221~24224
四个端口用于接管不同类型的日志;
docker run -p 24221:24221 -p 24222:24222 -p 24223:24223 -p 24224:24224 --name efk-fluentd \-v /mydata/fluentd/log:/fluentd/log \-v /mydata/fluentd/fluent.conf:/fluentd/etc/fluent.conf \-d fluent/fluentd:v1.10
- 第一次启动可能会失败,批改目录权限后重新启动即可;
chmod 777 /mydata/fluentd/log/
- 应用
root
用户进入Fluentd容器外部;
docker exec -it --user root efk-fluentd /bin/sh
- 装置Fluentd的Elasticsearch插件;
fluent-gem install fluent-plugin-elasticsearch
- 如果你仍然想应用
docker-compose
一次性装置EFK的话,能够应用如下脚本,留神
应用user:root
启动就不须要再批改目录权限了!
version: '3'services: elasticsearch: image: elasticsearch:6.4.0 container_name: efk-elasticsearch user: root environment: - "cluster.name=elasticsearch" #设置集群名称为elasticsearch - "discovery.type=single-node" #以繁多节点模式启动 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置应用jvm内存大小 - TZ=Asia/Shanghai volumes: - /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载 - /mydata/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载 ports: - 9200:9200 - 9300:9300 kibana: image: kibana:6.4.0 container_name: efk-kibana links: - elasticsearch:es #能够用es这个域名拜访elasticsearch服务 depends_on: - elasticsearch #kibana在elasticsearch启动之后再启动 environment: - "elasticsearch.hosts=http://es:9200" #设置拜访elasticsearch的地址 - TZ=Asia/Shanghai ports: - 5601:5601 fluentd: image: fluent/fluentd:v1.10 container_name: efk-fluentd user: root environment: - TZ=Asia/Shanghai volumes: - /mydata/fluentd/log:/fluentd/log - /mydata/fluentd/fluent.conf:/fluentd/etc/fluent.conf depends_on: - elasticsearch #kibana在elasticsearch启动之后再启动 links: - elasticsearch:es #能够用es这个域名拜访elasticsearch服务 ports: - 24221:24221 - 24222:24222 - 24223:24223 - 24224:24224
- 应用新的配置文件
fluent.conf
替换原来的配置文件,而后重新启动Fluentd服务,新的配置文件会在上面给出。
Fluentd配置详解
接下来咱们来介绍下Fluentd配置文件如何配置,先放出齐全配置,而后咱们对外面的一些配置要点进行具体阐明。
齐全配置
<source> @type tcp @id debug-input port 24221 tag debug <parse> @type json </parse></source><source> @type tcp @id error-input port 24222 tag error <parse> @type json </parse></source><source> @type tcp @id business-input port 24223 tag business <parse> @type json </parse></source><source> @type tcp @id record-input port 24224 tag record <parse> @type json </parse></source><filter record> @type parser key_name message reserve_data true remove_key_name_field true <parse> @type json </parse></filter><match fluent.**> @type stdout output_type json</match><match **> @type elasticsearch host 192.168.3.101 port 9200 type_name docker logstash_format true logstash_prefix docker-${tag}-logs logstash_dateformat %Y-%m-%d flush_interval 5s include_tag_key true</match>
配置要点解析
<source>
定义了日志收集的起源,能够有tcp、udp、tail(文件)、forward(tcp+udp)、http等形式。
这里咱们从tcp申请收集日志,端口为24221
,并且设置了tag为debug
。
<source> @type tcp @id debug-input port 24221 tag debug <parse> @type json </parse></source>
<parse>
定义对原始数据的解析形式,能够将日志转化为JSON。
比方咱们将debug日志转化为JSON能够进行如下配置。
<source> @type tcp @id debug-input port 24221 tag debug <parse> @type json </parse></source>
<filter>
能够对收集的日志进行一系列的解决,比如说将日志打印到控制台或者对日志进行解析。
将所有日志打印到控制台的配置:
<filter **> @type stdout</filter>
对于tag为record
起源的日志,咱们将其中的message
属性转化为JSON格局,如果不进行转化的话,message
属性将会是一个字符串。
<filter record> @type parser key_name message reserve_data true remove_key_name_field true <parse> @type json </parse></filter>
<match>
定义了收集到的日志最初输入到哪里,能够输入到stdout(控制台)、file、elasticsearch、mongo等外面。
这里咱们应用elasticsearch
来存储日志信息,logstash_format
、logstash_prefix
、logstash_dateformat
次要用来管制日志索引名称的生成,以后配置生成debug日志的索引格局为docker-debug-logs-2020-06-03
,flush_interval
用来管制日志输入到elasticsearch的工夫距离。
<match **> @type elasticsearch host 192.168.3.101 port 9200 type_name docker logstash_format true logstash_prefix docker-${tag}-logs logstash_dateformat %Y-%m-%d flush_interval 5s include_tag_key true</match>
替换配置文件
替换掉原来的/mydata/fluentd/fluent.conf
配置文件,而后再重新启动服务,咱们的Fluentd服务就能够开始收集日志了。
docekr restart efk-fluentd
联合SpringBoot应用
其实Fluentd收集日志的原理和Logstash一样,都是通过tcp端口来收集日志,所以咱们只有把logback配置文件中原来Logstash日志收集地址端口改为Fluentd的即可。
- 批改
logback-spring.xml
配置文件;
<!--DEBUG日志输入到LogStash--><appender name="LOG_STASH_DEBUG" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${LOG_STASH_HOST}:24221</destination></appender><!--ERROR日志输入到LogStash--><appender name="LOG_STASH_ERROR" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${LOG_STASH_HOST}:24222</destination></appender><!--业务日志输入到LogStash--><appender name="LOG_STASH_BUSINESS" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${LOG_STASH_HOST}:24223</destination></appender><!--接口拜访记录日志输入到LogStash--><appender name="LOG_STASH_RECORD" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${LOG_STASH_HOST}:24224</destination></appender>
- 如果你的Fluentd不是部署在原来Logstash的服务器上,还须要批改
application-dev.yml
配置中的logstash.host
属性。
logstash: host: localhost
- 启动并运行咱们的SpringBoot利用。
Kibana中查看日志
至此咱们的EFK日志收集零碎搭建实现了,只需在Kibana中应用即可。
- 在
Management->Kibana->Index Patterns
中能够创立Index Patterns
,Kibana服务拜访地址:http://192.168.3.101:5601
- 创立实现后查看日志,能够看出该日志收集性能和咱们之前搭建的ELK零碎完全相同。
Logstash vs Fluentd
接下来咱们来对这两个日志收集工具的各个方面做个比照。
比照方面 | Logstash | Fluentd |
---|---|---|
内存占用 | 启动1G左右 | 启动60M左右 |
CPU占用 | 较高 | 较低 |
反对插件 | 丰盛 | 丰盛 |
通用日志解析 | 反对grok(基于正则表达式)解析 | 反对正则表达式解析 |
特定日志类型 | 反对JSON等支流格局 | 反对JSON等支流格局 |
数据过滤 | 反对 | 反对 |
数据buffer发送 | 插件反对 | 插件反对 |
运行环境 | JRuby实现,依赖JVM环境 | CRuby、C实现,依赖Ruby环境 |
线程反对 | 反对多线程 | 多线程受GIL限度 |
参考资料
官网文档:https://docs.fluentd.org/
我的项目源码地址
https://github.com/macrozheng...
公众号
mall我的项目全套学习教程连载中,关注公众号第一工夫获取。