Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >日志收集方案EFK

日志收集方案EFK

原创
作者头像
liliane
发布于 2022-07-16 11:40:29
发布于 2022-07-16 11:40:29
2.6K00
代码可运行
举报
文章被收录于专栏:liliane随笔liliane随笔
运行总次数:0
代码可运行

导语

本文将介绍常见的分布式系统日志收集组件EFK的搭建,以及一些常见问题的处理。

概述

EFK(ElasticSearch、Fluentd、Kibana)是常见的分布式系统日志收集方案,es 用于存储数据,kibana 用于展示数据,支持各种搜索及维度聚合。fluentd 为日志收集工具,支持从各个数据源收集数据,对数据进行过滤、解析、转换、结构化后,写入 es。

可能大家听说得比较多的是 ELK,其中区别的 L,指的是 logstash,它是另一种日志收集工具,二者从功能上区别不大,网上有一些性能对比文章,总体上,fluentd 更优。

组件搭建

背景

在上云大背景下,es 组件直接购买云上资源即可。腾讯云 es 创建、使用参考 云官网 ES 产品 。创建 es 实例,即可使用可视化工具 kibana(开启外网 kibana 需注意安全问题,可仅开通内网访问,或设置访问网段白名单)。

由于团队使用基于k8s的容器化部署,为了收集容器内日志,我们通过挂载数据卷方式,将容器内的日志路径映射到节点本地磁盘固定位置。为了保证每个节点的日志都能及时被收集,我们通过 daemonset 方式,部署 fluentd,确保每个节点都有一个日志收集进程。fluentd 根据配置文件,将 tail 到的日志以一定的时间间隔写入到目标 es 实例。

关键步骤

1. 部署 td-agent.conf 配置

fluentd 部署过程最麻烦的一点在于,配置文件。fluentd 收集到日志后,根据配置文件,对日志进行处理和输出。因此,我们首先需要部署一个 configmap,将配置文件以 td-agent.conf 文件名挂载到容器指定路径(/etc/fluent/config.d)下(subPath)。configmap 配置文件内容,使用 |- 定义复杂属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data:   
    td-agent.conf:|-

以下是 td-agent.conf 示例:

代码语言:html
AI代码解释
复制
<match fluent.**>
  @type null
</match>
<source>
  @id xx-containers.log
  @type tail
  path /var/log/**/log.log
  pos_file /var/log/xx.log.pos
  tag log.**
  <parse>
        @type multiline
        format_firstline /^\[\d{4}\/\d{2}\/\d{2} /
        format1 /^\[(?<logtime>[^\]]*)\] \[(?<level>[^ ]*)\] (?<position>[\s\S\d]*): \[Action=(?<action>[^ ]*)\|RequestId=(?<reqId>[^|]*)\|AppId=(?<appid>[^ ]*)\|TfAid=(?<aid>[^|]*)\|TfUid=(?<uid>[^|]*)\|(?<context>[^\]]*)\] (?<message>[\s\S]*)$/
  </parse>
  emit_unmatched_lines false
  read_from_head false
</source>
<source>
  @id xx-containers.log
  @type tail
  path /var/log/**/vlog.log
  pos_file /var/log/xx.log.pos
  tag xx.*
  <parse>
    @type regexp
    expression /(?<logtime>\d{4}-[01]\d-[0-3]\d [0-2]\d:[0-5]\d:[0-5]\d\.\d{3})[\t ]*(?<level>[^\t ]*)[\t ]*(?<position>[^\t ]*)[\t ]*(?<message>[\s\S]*)$/
  </parse>
  emit_unmatched_lines false
  read_from_head false
</source>
<filter **>
  @type record_transformer
  enable_ruby true
  <record>
    message ${record.dig("position")}:${record.dig("message")}
  </record>
</filter>
<filter **>
  @type record_transformer
  <record>
    namespace ${tag_parts[4]}
  </record>
</filter>
<filter **>
  @type record_transformer
  <record>
    module ${tag_parts[5]}
  </record>
</filter>
<filter **>
  @type record_transformer
  <record>
    service_name ${tag_parts[4]}:${tag_parts[5]}
  </record>
</filter>
<match **>
   @type elasticsearch_dynamic
   @log_level debug
   include_tag_key true
   type_name _doc
   host xx
   port xx
   user xx
   password xx
   logstash_format true
   logstash_prefix logstash-xx-test
   <buffer>
        @type file
        path /var/log/fluentd/buffer
        flush_interval 5s
        flush_thread_count 10
        retry_forever false
        retry_max_times 1
		retry_wait 1s
        chunk_limit_size 8MB
        total_limit_size 256MB
        queue_limit_length 32
        compress gzip
   </buffer>
</match>

source

为输入源,关键配置:@type 选择以 tail 插件方式,读取 path (支持通配符)路径下文件内容。pos_file 记录当前读到文件位置。内容经过 parse 解析插件,按 @type multiline 多行方式解析。format_firstline 为多行解析中,首行正则规则,format1 为行内容正则。可配置多个输入源。这一步因为日志格式较复杂,为了避免失败反复重试,可以先 在线验证

read_from_head:为 true,将从文件头开始读,默认为 false。需注意,首次接入由于历史日志量,可能引发 es 的 circuit_breaking_exception。建议设置为 false,如果之前已经存在 pos_file 指定的文件,需要删除,才能从文件末尾开始读。

filter

为过滤器,通过 tag 匹配,符合条件的记录,这里我们用到了 @type record_transformer 插件,可以实现记录中字段的转换,包括增、删、改。如涉及表达式运算,需指定 enable_ruby true。如字段内容可能为空,可使用 dig,例如 ${record.dig("position")} ,避免异常。详见:https://docs.fluentd.org/filter/record_transformer

match

匹配 tag,输出类型指定 @type elasticsearch。如下文配置涉及表达式,如 logstash_prefix logstash-${tag_parts[3]}-test

,需使用 @type elasticsearch_dynamic

针对 es 版本不同,需要注意配置细节。es 7.5 以上,type_name 必填,否则系统报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
as the final mapping would have more than 1 type: [_doc, fluentd]
  • host、port、user、password 分配填已申请的 ES 集群信息。
  • logstash_format:true,fluentd 将会以 logstash 格式来转发结构化的日志数据
  • logstash_prefix:index 名称前缀,可以添加 ${tag} 占位符来标识不同数据源。例如不同环境的数据。
  • 或者使用 index_name logstash.${tag}.%Y%m%d 配置指定索引名称。
  • buffer:配置缓冲区,定时将缓冲区内容刷到 es。
  • 若日志量过大,可能引发 BufferOverflowError。可配置:queue_full_action drop_oldest_chunk 解决。

个人经验,fluentd 的配置可能遇到较多问题,大部分问题都可以去官网找到答案。

部署 fluentd 服务

挂载日志路径

需将业务产生日志的磁盘路径以本地路径挂载数据卷到 fluentd 容器内。

挂载配置文件

将步骤1创建的 configmap,挂载到容器内。fluentd 镜像需选择 fluentd-elasticsearch,数据卷挂载关注volumes、volumeMounts 配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1beta2
kind: DaemonSet
metadata:
  annotations:
    deprecated.daemonset.template.generation: "6"
    description: fluentd日志收集组件
  generation: 7
  labels:
    k8s-app: fluentd-es
    qcloud-app: fluentd-es
  name: fluentd-es
  namespace: kube-public
spec:
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: fluentd-es
      qcloud-app: fluentd-es
  template:
    metadata:
      creationTimestamp: null
      labels:
        k8s-app: fluentd-es
        qcloud-app: fluentd-es
    spec:
      containers:
      - image: ccr.ccs.tencentyun.com/k8s-comm/fluentd-elasticsearch:v2.5.2
        imagePullPolicy: IfNotPresent
        name: fluentd-es
        resources:
          limits:
            cpu: "1"
            memory: 2Gi
          requests:
            cpu: 500m
            memory: 256Mi
        securityContext:
          privileged: false
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /var/log
          name: varlog
        - mountPath: /var/lib/docker/containers
          name: varlibdockercontainers
        - mountPath: /etc/fluent/config.d
          name: config-volume
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: efk
      serviceAccountName: efk
      terminationGracePeriodSeconds: 30
      volumes:
      - hostPath:
          path: /var/log
          type: DirectoryOrCreate
        name: varlog
      - hostPath:
          path: /var/lib/docker/containers
          type: DirectoryOrCreate
        name: varlibdockercontainers
      - configMap:
          defaultMode: 420
          name: td-agent-config
        name: config-volume
  updateStrategy:
    type: OnDelete

参考文献

  1. fluentd 文本解析规则在线测试工具:https://fluentular.herokuapp.com/
  2. fluentd官方文档:https://docs.fluentd.org/
  3. EFK、ELK区别:https://cloud.tencent.com/developer/article/1770741

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入OceanBase内部机制:高性能分布式(实时HTAP)关系数据库概述
OceanBase是由蚂蚁集团完全自主研发的国产原生分布式数据库。它的设计初衷是为了满足日益增长的数据处理需求,特别是在金融、电商等对数据库性能、稳定性和扩展性有极高要求的行业中。OceanBase采用了分布式架构和一体化设计,兼具分布式架构的扩展性与集中式架构的性能优势,通过一套引擎同时支持OLTP(在线事务处理)和OLAP(在线分析处理)的混合负载。
公众号:码到三十五
2024/04/02
7770
深入OceanBase内部机制:高性能分布式(实时HTAP)关系数据库概述
分布式存储系统一致性与可用性的较量,服了!
我们要知道,无论技术如何发展,要想保证系统的高可用,其核心最本质的方法就是 “冗余”。冗余,就是为我们的系统多创建几个副本,来增加系统的可靠性和容错性。
架构师修炼
2023/09/03
4320
分布式存储系统一致性与可用性的较量,服了!
分布式系统中如何保证数据一致?
在分布式系统中,保证数据一致性是一个复杂而关键的问题。由于系统的分布性,不同节点上的数据可能会发生变化,而系统需要采取一些机制来确保数据的一致性。以下是一些常见的方法:
孟斯特
2023/12/29
1.2K0
分布式系统中如何保证数据一致?
数据一致性:核心概念与实现策略
数据一致性是指在进行一系列操作后,数据能够达到预期的状态。在数据库中,一致性通常是指数据满足一定的约束条件,例如,关系数据库中的外键约束、唯一性约束等。
栗筝i
2023/10/16
2.1K0
数据一致性:核心概念与实现策略
「分布式架构」“一切都是分布式”说最终一致性
大约一年前,我在一致性模型上写了这篇文章的第一个版本,但我从来没有对它感到满意,因为它写得很匆忙,而且这个主题足够重要,需要得到更彻底的处理。ACM Queue要求我修改它以便在他们的杂志中使用,我利用这个机会改进了这篇文章。这是那个新版本。
架构师研究会
2021/01/06
6040
分布式系统之CAP理论之详解
  CAP原本是一个猜想,2000年PODC大会的时候大牛Brewer提出的,他认为在设计一个大规模可扩放的网络服务时候会遇到三个特性:一致性(consistency)、可用性(Availability)、分区容错(partition-tolerance)都需要的情景,然而这是不可能都实现的。之后在2003年的时候,Mit的Gilbert和Lynch就正式的证明了这三个特征确实是不可以兼得的。该理论是NoSQL数据库管理系统构建的基础。。
孙杰
2019/10/29
2.7K0
分布式CAP定理
CAP定理又称CAP原则,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),最多只能同时三个特性中的两个,三者不可兼得。
chenchenchen
2021/09/06
1.2K0
分布式系统(微服务架构)的一致性和幂等性问题相关概念解析
前言 什么是分布式系统?关于这点其实并没有明确且统一的定义。在我看来,只要一个系统满足以下几点就可以称之为分布式系统 系统由物理上不同分布的多个机器节点组成 系统的多个节点通过网络进行通信,协调彼此之
java架构师
2019/02/26
5590
保证分布式系统数据一致性的6种方案
在电商等业务中,系统一般由多个独立的服务组成,如何解决分布式调用时候数据的一致性? 具体业务场景如下,比如一个业务操作,如果同时调用服务 A、B、C,需要满足要么同时成功;要么同时失败。A、B、C 可能是多个不同部门开发、部署在不同服务器上的远程服务。 在分布式系统来说,如果不想牺牲一致性,CAP 理论告诉我们只能放弃可用性,这显然不能接受。为了便于讨论问题,先简单介绍下数据一致性的基础理论。 强一致 当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户
程序员鹏磊
2018/02/09
16.1K0
保证分布式系统数据一致性的6种方案
分布式数据库数据一致性原理说明与实现
企鹅号小编
2018/01/05
4.2K0
分布式数据库数据一致性原理说明与实现
关于集群和分布式
集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源,这些单个的计算机系统就是集群的节点(node)。集群提供了以下关键的特性。
用户7353950
2023/02/23
9600
关于集群和分布式
图解分布式存储技术
一般大型的分布式微服务项目,都会涉及海量数据、高并发读写等场景,就需要用到分布式数据存储。
方才编程_公众号同名
2025/04/11
1250
图解分布式存储技术
分布式事务一致性实现的方式总结
  因为最近项目正在做重构,而这次重构实质上比原来更接近于SOA化和微服务的思想。对于我们金融交易来说,数据结果的准确性是重中之重。所以今天总结一下分布式事务的实现方法,下次组内周会给大家统一一下概念。 刚性事务和柔性事务   刚性事务:严格遵循ACID原则(原子性、一致性、隔离性、持久性)的事务。基本上指的是本地数据库事务。根据CAP原则,分布式下的事务都不是刚性事务。   柔性事务:遵循CAP理论或者其变种BASE理论的事务。分布式事务基本上都是柔性事务。   因为刚性事务基本上等价于本地数据库事务,而
静儿
2018/07/02
7500
分布式事务
https://mp.weixin.qq.com/s/n6bI335w7mJFoBeR2aJqVw
Get
2024/03/25
2140
分布式系统事务一致性
现今互联网界,分布式系统和微服务架构盛行。业界著名的CAP理论也告诉我们,在设计和实现一个分布式系统时,需要将数据一致性、系统可用性和分区容忍性放在一起考虑。
Java编程指南
2020/06/28
8240
分布式系统事务一致性
爱分析 x TapData:实时关键业务场景快速增长,我们需要什么样的数据平台来支持?
近日,爱分析联合 TapData 发布实时数据集成解决方案调研报告,结合金融行业案例,从实时数据业务场景的定义和需求发展现状,剖析到传统方案与现代化数据平台方案的优劣对比,以期为各行业的数据资源挖掘与应用提供新的思路参考。以下为报告正文。
Tapdata
2024/07/01
1570
爱分析 x TapData:实时关键业务场景快速增长,我们需要什么样的数据平台来支持?
为什么单体不用考虑一致性而分布式需要?
软件开发领域有一个著名的“不可能三角”——质量、成本、时间,三者无法兼得。这也是 IT 行业没有银弹解决方案的根因所在,就好像分布式系统在带来高并发能力,突破 CPU 计算瓶颈与存储限制时,不可避免地带来了数据一致性的问题。 网上谈论数据一致性的文章不少,大多从算法的角度切入,本文作者选择了从服务架构的角度切入,详细拆解了主从架构、主主架构、无主架构三种架构模式下,数据一致性的难点与解决方案。
腾讯云开发者
2024/03/26
4740
为什么单体不用考虑一致性而分布式需要?
浅谈分布式系统的一致性协议(一)
我们在Mysql系列文章中已经介绍过,我们常用的InnoDB存储引擎是支持事务的。这里所说的事务由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元。事务保证了这一组操作要么都成功,要么都失败;并且事务提交之后,数据不会丢失。总结下来就是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),即ACID四个特性。这种事务是针对单个数据库的,数据库底层只是在单个计算机内部通过一系列机制实现了ACID特性,不需要与其他外部数据源进行交互。从系统架构上划分,这属于集中式系统架构,这也符合早期做的传统软件项目的特点,没有负载均衡,都是单机运行,而数据库也是单台,只是做数据库备份,在主库宕掉时,切换到从库即可。
搬砖俱乐部
2019/09/27
1.2K0
浅谈分布式系统的一致性协议(一)
「数据一致性」理解分布式系统中的一致性
多节点提供读写服务,确保高可用性和可扩展性(ZooKeeper, DNS, redis集群)
架构师研究会
2021/01/06
8220
分布式知识总结
分布式事务是指在分布式系统上实现事务,同样需要保证 ACID,尤其是一致性。 分布式事务保证强一致性,但牺牲可用性。
willsonchen
2024/01/25
2470
推荐阅读
相关推荐
深入OceanBase内部机制:高性能分布式(实时HTAP)关系数据库概述
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验