前言
随着容器化技术的普及,日志管理变得愈发重要。Docker作为一种轻量级的容器化解决方案,提供了丰富的日志生成和管理功能。
Docker默认会为每个容器生成的日志文件并保存在/var/lib/docker/containers/containerID/containerID-json.log
文件中,日志驱动是支持拓展的,在这个领域,Fluentd作为一种流行的开源日志收集工具,为Docker用户提供了灵活而强大的日志收集解决方案。
什么是Fluentd?
Fluentd 是云原生计算基金会 (CNCF)毕业的项目,是一个开源的数据收集器,相对于logstash来说更加轻量灵活,专为在大规模数据流中收集、过滤和转发日志而设计。它具有轻量级、可扩展和易于定制的特点,使其成为处理各种日志数据的理想选择。Fluentd支持多种输入和输出插件,使其能够集成到不同的环境中。
为什么选择Fluentd作为Docker日志驱动?
在Docker中,容器生成的日志是实时且大量的。为了有效地收集和管理这些日志,选择适当的日志驱动至关重要。Fluentd作为Docker的日志驱动有以下几个优势:
- 多样的数据源支持: Fluentd支持各种数据源,包括文件、TCP、UDP、HTTP等。这意味着无论你的应用程序在哪里生成日志,Fluentd都能够轻松地进行收集。
- 灵活的插件系统: Fluentd的插件系统非常灵活,可以轻松扩展其功能。你可以根据需要添加输入、输出、过滤器等插件,以满足特定的日志收集和处理需求。
- 可视化和中央化管理: 使用Fluentd作为日志驱动,你可以将所有的Docker容器日志集中管理。这样一来,你可以轻松查看、搜索和分析所有应用程序的日志,从而更好地监控系统状态。
- 使用 JSON 进行统一日志记录:Fluentd 尝试尽可能将数据结构化为 JSON:这使得 Fluentd 能够统一处理日志数据的所有方面:跨多个源和目的地收集、过滤、缓冲和输出日志(统一日志层)。使用 JSON 进行下游数据处理要容易得多,因为它具有足够的结构可供访问,同时保留灵活的模式。
在Docker中使用Fluentd
准备用于启动fluentd以及收集目标容器的docker-compose文件
version: '3.7'
x-logging:
&default-logging
driver: fluentd #指定使用 Fluentd 作为日志驱动器
options:
fluentd-address: localhost:24224 #指定 Fluentd 服务的地址。
fluentd-async-connect: 'true' #启用异步连接
mode: non-blocking
max-buffer-size: 4m
tag: "ming.{{.Name}}" #{{.Name}}是容器名
services:
fluentd:
image: fluent/fluentd:v1.3.2
ports:
- 24224:24224
volumes:
- ./conf/fluent.conf:/fluentd/etc/fluent.conf
- /var/log/fluentd:/var/log/fluentd
environment:
- FLUENTD_CONF=fluent.conf
fluentd-redis:
image: redis
depends_on:
- fluentd
logging: *default-logging
fluentd-worker:
image: fluent/fluentd:v1.3.2
depends_on:
- fluentd
logging: *default-logging
准备Fluentd 的配置文件,用于定义 Fluentd 如何处理和转发日志数据。这个配置文件包含了输入、输出、过滤器等指令,以及各种参数,用于定制 Fluentd 的行为。
在 fluentd.conf 文件中,你可以配置:
- 输入插件(Input Plugins): 定义 Fluentd 从哪里接收日志数据。例如,从文件、TCP、UDP、HTTP 等。
- 输出插件(Output Plugins): 定义 Fluentd 将日志数据发送到哪里。可以是文件、数据库、消息队列、其他日志收集器等。
- 过滤器(Filter Plugins): 定义 Fluentd 如何处理、转换或过滤日志数据。可以用于对数据进行格式化、筛选、标记等操作。
- 缓冲区(Buffer Settings): 定义 Fluentd 如何管理和处理日志数据的缓冲。可以配置缓冲区的大小、刷新策略等。
- 格式化(Format Plugins): 定义日志数据的格式,以便正确地解析和处理。
…
fluent.conf:
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<match ming.*>
@type file
path /var/log/fluentd/ming/${tag[1]} #输出文件的路径,tag[1]在这里对应获取到的是容器名
append true
<format>
@type single_value
message_key log
</format>
<buffer tag,time>
@type file
timekey 1d
timekey_wait 10m
flush_mode interval
flush_interval 5s
</buffer>
</match>
<match **>
@type file
path /var/log/fluentd/${tag}
append true
<format>
@type single_value
message_key log
</format>
<buffer tag,time>
@type file
timekey 1d
timekey_wait 10m
flush_mode interval
flush_interval 5s
</buffer>
</match>
fluentd需要在配置的输出目录下有写入权限,因此需要赋予输出路径写入权限
mkdir /var/log/fluentd
chmod -R 777 /var/log/fluentd
在docker-compose.yml和fluentd.conf的目录中执行命令
启动成功
查看下fluentd输出日志目录下,就有对应的容器日志文件了(这里可以看到日志文件对应了容器名并且按我们的指示拼接了时间信息)
可拓展性
实际上,fluentd不仅可以将日志收集到本地,还可以将收集到的日志传输出去,例如输出到elasticsearch、mongo、kafka等等。
<match my.logs>
@type elasticsearch
host localhost
port 9200
logstash_format true
</match>
# Single MongoDB
<match mongo.**>
@type mongo
host fluentd
port 27017
database fluentd
collection test
# for capped collection
capped
capped_size 1024m
# authentication
user michael
password jordan
<inject>
# key name of timestamp
time_key time
</inject>
<buffer>
# flush
flush_interval 10s
</buffer>
</match>
<match pattern>
@type kafka2
# list of seed brokers
brokers <broker1_host>:<broker1_port>,<broker2_host>:<broker2_port>
use_event_time true
# buffer settings
<buffer topic>
@type file
path /var/log/td-agent/buffer/td
flush_interval 3s
</buffer>
# data type settings
<format>
@type json
</format>
# topic settings
topic_key topic
default_topic messages
# producer settings
required_acks -1
compression_codec gzip
</match>
通过利用插件,你可以更好地利用你的日志。
使用架构
使用fluentd收集docker日志后可以将容器汇总到一起.来看看配置了本文的fluentd配置文件后的架构:
由于fluentd配置的是存储在fluentd所在机器的本地目录,所以效果是将其他机器的容器日志收集到fluentd所在机器的本地目录中。
结语
总体而言,Fluentd作为Docker的日志驱动为容器化环境提供了可靠而灵活的日志管理解决方案,为系统监控、故障排除和日志分析提供了有力的支持。