共计 6012 个字符,预计需要花费 16 分钟才能阅读完成。
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 我的项目全套学习教程连载中,关注公众号 第一工夫获取。