ELK
日志收集系統(tǒng)大家都知道,,但是還有一種日志收集系統(tǒng)EFK
,,肯定有很多朋友不知道,!這里的F
指的是Fluentd
,,它具有Logstash類似的日志收集功能,,但是內(nèi)存占用連Logstash的十分之一都不到,,性能優(yōu)越、非常輕巧,。本文將詳細(xì)介紹Fluentd的使用,,主要用來收集SpringBoot應(yīng)用的日志,希望對大家有所幫助,!
Fluentd 簡介
Fluentd是一款開源的日志收集功能,,致力于為用戶搭建統(tǒng)一的日志收集層,,和Elasticsearch、Kibana一起使用可以搭建EFK日志收集系統(tǒng),。什么是統(tǒng)一的日志收集層呢,?看下下面這張圖就清楚了!
安裝
在《你居然還去服務(wù)器上撈日志,,搭個日志收集系統(tǒng)難道不香么,!》中已經(jīng)介紹了ELK日志收集系統(tǒng)的搭建,這里就不再介紹Elasticsearch和Kibana的安裝了,,直接介紹Fluentd在Docker環(huán)境下的安裝,。
docker pull fluent/fluentd:v1.10
- 將默認(rèn)配置
fluent.conf
文件復(fù)制到/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服務(wù),,需要開放
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
- 第一次啟動可能會失敗,,修改目錄權(quán)限后重新啟動即可,;
chmod 777 /mydata/fluentd/log/
- 使用
root
用戶進(jìn)入Fluentd容器內(nèi)部,;
docker exec -it --user root efk-fluentd /bin/sh
- 安裝Fluentd的Elasticsearch插件,;
fluent-gem install fluent-plugin-elasticsearch
- 如果你依然想使用
docker-compose
一次性安裝EFK的話,可以使用如下腳本,,注意
使用user:root
啟動就不需要再修改目錄權(quán)限了,!
version: '3'
services:
elasticsearch:
image: elasticsearch:6.4.0
container_name: efk-elasticsearch
user: root
environment:
- "cluster.name=elasticsearch" #設(shè)置集群名稱為elasticsearch
- "discovery.type=single-node" #以單一節(jié)點模式啟動
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" #設(shè)置使用jvm內(nèi)存大小
- TZ=Asia/Shanghai
volumes:
- /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件掛載
- /mydata/elasticsearch/data:/usr/share/elasticsearch/data #數(shù)據(jù)文件掛載
ports:
- 9200:9200
- 9300:9300
kibana:
image: kibana:6.4.0
container_name: efk-kibana
links:
- elasticsearch:es #可以用es這個域名訪問elasticsearch服務(wù)
depends_on:
- elasticsearch #kibana在elasticsearch啟動之后再啟動
environment:
- "elasticsearch.hosts=http://es:9200" #設(shè)置訪問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服務(wù)
ports:
- 24221:24221
- 24222:24222
- 24223:24223
- 24224:24224
- 使用新的配置文件
fluent.conf
替換原來的配置文件,,然后重新啟動Fluentd服務(wù),,新的配置文件會在下面給出。
Fluentd配置詳解
接下來我們來介紹下Fluentd配置文件如何配置,,先放出完全配置,,然后我們對里面的一些配置要點進(jìn)行詳細(xì)說明。
完全配置
<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
,,并且設(shè)置了tag為debug
,。
<source>
@type tcp
@id debug-input
port 24221
tag debug
<parse>
@type json
</parse>
</source>
<parse>
定義對原始數(shù)據(jù)的解析方式,可以將日志轉(zhuǎn)化為JSON,。
比如我們將debug日志轉(zhuǎn)化為JSON可以進(jìn)行如下配置,。
<source>
@type tcp
@id debug-input
port 24221
tag debug
<parse>
@type json
</parse>
</source>
<filter>
可以對收集的日志進(jìn)行一系列的處理,比如說將日志打印到控制臺或者對日志進(jìn)行解析,。
將所有日志打印到控制臺的配置:
<filter **>
@type stdout
</filter>
對于tag為record
來源的日志,,我們將其中的message
屬性轉(zhuǎn)化為JSON格式,如果不進(jìn)行轉(zhuǎn)化的話,,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
主要用來控制日志索引名稱的生成,當(dāng)前配置生成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
配置文件,然后再重新啟動服務(wù),,我們的Fluentd服務(wù)就可以開始收集日志了,。
docekr restart efk-fluentd
結(jié)合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>
<!--業(yè)務(wù)日志輸出到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的服務(wù)器上,,還需要修改
application-dev.yml
配置中的logstash.host
屬性,。
logstash:
host: localhost
- 啟動并運行我們的SpringBoot應(yīng)用。
Kibana中查看日志
至此我們的EFK日志收集系統(tǒng)搭建完成了,,只需在Kibana中使用即可,。
- 在
Management->Kibana->Index Patterns
中可以創(chuàng)建Index Patterns
,Kibana服務(wù)訪問地址:http://192.168.3.101:5601
- 創(chuàng)建完成后查看日志,,可以看出該日志收集功能和我們之前搭建的ELK系統(tǒng)完全相同,。
Logstash vs Fluentd
接下來我們來對這兩個日志收集工具的各個方面做個對比,。
對比方面 | Logstash | Fluentd |
---|
內(nèi)存占用 | 啟動1G左右 | 啟動60M左右 |
CPU占用 | 較高 | 較低 |
支持插件 | 豐富 | 豐富 |
通用日志解析 | 支持grok(基于正則表達(dá)式)解析 | 支持正則表達(dá)式解析 |
特定日志類型 | 支持JSON等主流格式 | 支持JSON等主流格式 |
數(shù)據(jù)過濾 | 支持 | 支持 |
數(shù)據(jù)buffer發(fā)送 | 插件支持 | 插件支持 |
運行環(huán)境 | JRuby實現(xiàn),依賴JVM環(huán)境 | CRuby,、C實現(xiàn),,依賴Ruby環(huán)境 |
線程支持 | 支持多線程 | 多線程受GIL限制 |
參考資料
官方文檔:https://docs./
項目源碼地址
https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-log