轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷

数字琉璃渡
• 阅读 1363

以往有篇文章介绍 EFK(Kibana + ElasticSearch + Filebeat)的插件日志收集。Filebeat 插件用于转发和集中日志数据,并将它们转发到 Elasticsearch 或 Logstash 以进行索引,但 Filebeat 作为 Elastic 的一员,只能在 Elastic 整个体系中使用。

Fluentd

Fluentd是一个开源的,分布式日志采集系统,可以从不同的服务,数据源采集日志,对日志进行过滤加工,分发给多种存储和处理系统。支持各种插件,数据缓存机制,且本身所需的资源很少,内置可靠性,结合其他服务,可以形成高效直观的日志收集平台。

本文介绍在 Rainbond 中使用 Fluentd 插件,收集业务日志,输出到多个不同的服务。

一、整合架构

在收集组件日志时,只需在组件中开通 Fluentd 插件,本文将演示以下两种方式:

  1. Kibana + ElasticSearch + Fluentd
  2. Minio + Fluentd

我们将 Fluentd 制作成 Rainbond 的 一般类型插件 ,在应用启动之后,插件也随之启动并自动收集日志输出到多个服务源,整个过程对应用容器无侵入,且拓展性强。

轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷

二、插件原理分析

Rainbond V5.7.0 版本中新增了:从开源应用商店安装插件,本文中的插件已发布到开源应用商店,当我们使用时一键安装即可,根据需求修改配置文件。

Rainbond 插件体系是相对于 Rainbond 应用模型的一部分,插件主要用来实现应用容器扩展运维能力。由于运维工具的实现有较大的共性,因此插件本身可以被复用。插件必须绑定到应用容器时才具有运行时状态,用以实现一种运维能力,比如性能分析插件、网络治理插件、初始化类型插件。

在制作 Fluentd 插件的过程中,使用到了 一般类型插件,可以理解为一个POD启动两个 Container,Kubernetes原生支持一个POD中启动多个 Container,但配置起来相对复杂,在 Rainbond 中通过插件实现使用户操作更加简单。

三、EFK 日志收集实践

Fluentd-ElasticSearch7 输出插件将日志记录写入 Elasticsearch。默认情况下,它使用批量 API创建记录,该 API 在单个 API 调用中执行多个索引操作。这减少了开销并可以大大提高索引速度。

3.1 操作步骤

应用 (Kibana + ElasticSearch)和插件(Fluentd)都可以通过开源应用商店一键部署。

  1. 对接开源应用商店
  2. 在应用商店中搜索 elasticsearch 并安装 7.15.2 版本。
  3. 团队视图 -> 插件 -> 从应用商店安装 Fluentd-ElasticSearch7 插件
  4. 基于镜像创建组件,镜像使用 nginx:latest,并且挂载存储var/log/nginx。这里使用 Nginx:latest 作为演示

    • 在组件内挂载存储后,插件也会自定挂载该存储,并可访问 Nginx 产生的日志文件。
  5. 在 Nginx 组件内开通插件,可以根据所需进行修改 Fluentd 配置文件,可参考下方配置文件简介部分。

轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷

  1. 添加 ElasticSearch 依赖,将 Nginx 连接到 ElasticSearch,如下图:

轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷

  1. 访问 Kibana 面板,进入到 Stack Management -> 数据 -> 索引管理,可以看到已存在的索引名称为 fluentd.es.nginx.log
  2. 访问 Kibana 面板,进入到 Stack Management -> Kibana -> 索引模式,创建索引模式。
  3. 进入到 Discover,日志正常展示。

轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷

3.2 配置文件介绍

配置文件参考 Fluentd 文档 output_elasticsearch

<source>
  @type tail
  path /var/log/nginx/access.log,/var/log/nginx/error.log
  pos_file /var/log/nginx/nginx.access.log.pos
  <parse>
    @type nginx
  </parse>
  tag es.nginx.log
</source>

<match es.nginx.**>
  @type elasticsearch   
  log_level info          
  hosts 127.0.0.1
  port 9200
  user elastic
  password elastic
  index_name fluentd.${tag}
  <buffer>
    chunk_limit_size 2M
    queue_limit_length  32
    flush_interval 5s
    retry_max_times 30
  </buffer>
</match>

配置项解释:

\<source>\</source> 日志的输入源:

配置项解释说明
@type采集日志类型,tail表示增量读取日志内容
path日志路径,多个路径可以使用逗号分隔
pos_file用于标记已经读取到位置的文件(position file)所在的路径
\<parse>\</parse>日志格式解析,根据你自己的日志格式,编写对应的解析规则。

\<match>\</match>日志的输出端:

配置项解释说明
@type输出到的服务类型
log_level设置输出日志的级别为info;支持的日志级别有:fatal, error, warn, info, debug, trace.
hostselasticsearch的地址
portelasticsearch的端口
user/passwordelasticsearch用到的用户名/密码
index_nameindex定义的名称
\<buffer>\</buffer>日志的缓冲区,用于缓存日志事件,提高系统性能。默认使用内存,也可以使用file文件
chunk_limit_size每个块的最大大小:事件将被写入块,直到块的大小变成这个大小,内存默认为8M,文件256M
queue_limit_length此缓冲插件实例的队列长度限制
flush_interval缓冲区日志刷新事件,默认60s刷新输出一次
retry_max_times重试失败块输出的最大次数

以上只是部分配置参数,其他配置可以跟官网文档自定义。

四、Fluentd + Minio 日志收集实践

Fluentd S3 输出插件将日志记录写入到标准的 S3 对象存储服务,例如 Amazon、Minio。

4.1 操作步骤

应用(Minio)和插件(Fluentd S3)都可以通过开源应用商店进行一键部署。

  1. 对接开源应用商店。在开源应用商店中搜索 minio,并安装 22.06.17 版本。
  2. 团队视图 -> 插件 -> 从应用商店安装 Fluentd-S3 插件。
  3. 访问 Minio 9090 端口,用户密码在 Minio 组件 -> 依赖中获取。

    • 创建 Bucket,自定义名称。
    • 进入 Configurations -> Region,设置 Service Location

      • Fluentd 插件的配置文件中 s3_region 默认为 en-west-test2
  4. 基于镜像创建组件,镜像使用 nginx:latest,并且挂载存储var/log/nginx。这里使用 Nginx:latest 作为演示

    • 在组件内挂载存储后,插件也会自定挂载该存储,并可访问 Nginx 产生的日志文件。
  5. 进入到 Nginx 组件内,开通 Fluentd S3 插件,修改配置文件中的 s3_bucket s3_region

轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷

  1. 建立依赖关系,Nginx 组件依赖 Minio,更新组件使其生效。

轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷

  1. 访问 Nginx 服务,让其产生日志,片刻后就可以在 Minio 的 Bucket 中看到。

轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷

4.2 配置文件介绍

配置文件参考 Fluentd 文档 Apache to Minio

<source>
  @type tail
  path /var/log/nginx/access.log
  pos_file /var/log/nginx/nginx.access.log.pos
  tag minio.nginx.access
  <parse>
    @type nginx
  </parse>
</source>

<match minio.nginx.**>
  @type s3        
  aws_key_id "#{ENV['MINIO_ROOT_USER']}"
  aws_sec_key "#{ENV['MINIO_ROOT_PASSWORD']}"
  s3_endpoint http://127.0.0.1:9000/
  s3_bucket test
  s3_region en-west-test2
  time_slice_format %Y%m%d%H%M 
  force_path_style true
  path logs/
  <buffer time>
    @type file
    path /var/log/nginx/s3
    timekey 1m                 
    timekey_wait 10s            
    chunk_limit_size 256m       
  </buffer>
</match>

配置项解释:

\<source>\</source> 日志的输入源:

配置项解释说明
@type采集日志类型,tail表示增量读取日志内容
path日志路径,多个路径可以使用逗号分隔
pos_file用于标记已经读取到位置的文件(position file)所在的路径
\<parse>\</parse>日志格式解析,根据你自己的日志格式,编写对应的解析规则。

\<match>\</match>日志的输出端:

配置项解释说明
@type输出到的服务类型
aws_key_idMinio 用户名
aws_sec_keyMinio 密码
s3_endpointMinio 访问地址
s3_bucketMinio 桶名称
force_path_style防止 AWS SDK 破坏端点 URL
time_slice_format每个文件名都加上这个时间戳
\<buffer>\</buffer>日志的缓冲区,用于缓存日志事件,提高系统性能。默认使用内存,也可以使用file文件
timekey每 60 秒刷新一次累积的chunk
timekey_wait等待 10 秒再刷新
chunk_limit_size每个块的最大大小

最后

Fluentd 插件可以很灵活的收集业务日志并输出至多个服务,并结合 Rainbond 插件市场的一键安装,让我们的使用变得更加简单、快捷。

目前 Rainbond 开源插件应用市场的 Flunetd 插件只有 Flunetd-S3 Flunetd-ElasticSearch7,欢迎小伙伴们贡献插件哦!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这