使用Fluentd作为Docker日志收集


前言

随着容器化技术的普及,日志管理变得愈发重要。Docker作为一种轻量级的容器化解决方案,提供了丰富的日志生成和管理功能。
Docker默认会为每个容器生成的日志文件并保存在/var/lib/docker/containers/containerID/containerID-json.log文件中,日志驱动是支持拓展的,在这个领域,Fluentd作为一种流行的开源日志收集工具,为Docker用户提供了灵活而强大的日志收集解决方案。

什么是Fluentd?

Fluentd 是云原生计算基金会 (CNCF)毕业的项目,是一个开源的数据收集器,相对于logstash来说更加轻量灵活,专为在大规模数据流中收集、过滤和转发日志而设计。它具有轻量级、可扩展和易于定制的特点,使其成为处理各种日志数据的理想选择。Fluentd支持多种输入和输出插件,使其能够集成到不同的环境中。

为什么选择Fluentd作为Docker日志驱动?

在Docker中,容器生成的日志是实时且大量的。为了有效地收集和管理这些日志,选择适当的日志驱动至关重要。Fluentd作为Docker的日志驱动有以下几个优势:

  1. 多样的数据源支持: Fluentd支持各种数据源,包括文件、TCP、UDP、HTTP等。这意味着无论你的应用程序在哪里生成日志,Fluentd都能够轻松地进行收集。
  2. 灵活的插件系统: Fluentd的插件系统非常灵活,可以轻松扩展其功能。你可以根据需要添加输入、输出、过滤器等插件,以满足特定的日志收集和处理需求。
  3. 可视化和中央化管理: 使用Fluentd作为日志驱动,你可以将所有的Docker容器日志集中管理。这样一来,你可以轻松查看、搜索和分析所有应用程序的日志,从而更好地监控系统状态。
  4. 使用 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 文件中,你可以配置:

  1. 输入插件(Input Plugins): 定义 Fluentd 从哪里接收日志数据。例如,从文件、TCP、UDP、HTTP 等。
  2. 输出插件(Output Plugins): 定义 Fluentd 将日志数据发送到哪里。可以是文件、数据库、消息队列、其他日志收集器等。
  3. 过滤器(Filter Plugins): 定义 Fluentd 如何处理、转换或过滤日志数据。可以用于对数据进行格式化、筛选、标记等操作。
  4. 缓冲区(Buffer Settings): 定义 Fluentd 如何管理和处理日志数据的缓冲。可以配置缓冲区的大小、刷新策略等。
  5. 格式化(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的目录中执行命令
image.png
启动成功
image.png
查看下fluentd输出日志目录下,就有对应的容器日志文件了(这里可以看到日志文件对应了容器名并且按我们的指示拼接了时间信息)
image.png

可拓展性

实际上,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的日志驱动为容器化环境提供了可靠而灵活的日志管理解决方案,为系统监控、故障排除和日志分析提供了有力的支持。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值