Loading [MathJax]/jax/input/TeX/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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kubernetes 集群日志监控 EFK 安装
Kubernetes 集群中会编排非常多的服务,各个服务不可能保证服务一定能稳定的运行,于是每个服务都会打印出各自的日志信息方便调试。由于服务的众多,每个服务挨个查看日志显然是一件非常复杂的事情,故而日志的统一收集、整理显得尤为重要。
高楼Zee
2021/03/16
1.7K0
使用 EFKLK 搭建 Kubernetes 日志收集工具栈
前面大家介绍了 Kubernetes 集群中的几种日志收集方案,Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch、Fluentd 和 Kibana(EFK)技术栈,也是官方现在比较推荐的一种方案。
CNCF
2021/05/07
2.1K0
使用 EFKLK 搭建 Kubernetes 日志收集工具栈
EFK日志平台部署
日志收集方案是采用 Elasticsearch、Fluentd、Filebeat 和 Kibana(EFK)技术栈。 Fluented主要用来收集k8s组件和docker容器日志,Filebeat主要用来收集应用日志,主要因为目前项目中应用日志并未全部通过stdout方式输出到docker日志驱动中,导致flunted收集日志并不全面,需要通过Filebeat来将应用日志收集到es中,再由kibana来展示。
mikelLam
2022/10/31
1.1K0
EFK日志平台部署
号称下一代日志收集系统!来看看它有多强
关于日志收集、处理、分析的方案,其实是很多,常见的就是ELK组合,即:Elasticsearch + Logstash + Kibana,官方网站:https://www.elastic.co/products
民工哥
2021/07/16
8720
号称下一代日志收集系统!来看看它有多强
在 Kubernetes 上搭建 EFK 日志收集系统
上节课和大家介绍了 Kubernetes 集群中的几种日志收集方案,Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch、Fluentd 和 Kibana(EFK)技术栈,也是官方现在比较推荐的一种方案。
我是阳明
2020/06/13
5.3K0
在 Kubernetes 上搭建 EFK 日志收集系统
TKE上搭建EFK日志采集系统
需要创建一个SC,用来后续ES创建时候动态挂载PVC,在腾讯云中,如果挂载了卷,又起了多个pod,可以采用自动动态挂载PVC
聂伟星
2020/06/10
9020
TKE中部署EFK日志收集
通过DaemonSet在每一台Node节点上跑一个Filebeat或fluentd,然后通过挂载的形式将容器日志与该Pod关联,从而处理发送至后端存储;
蒋经纬
2020/06/19
6030
部署EFK pod日志分析系统
EFK不是一个软件,而是一套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用,是目前主流的一种日志系统。EFK是三个开源软件的缩写,分别表示:Elasticsearch , Fluentd, Kibana
星哥玩云
2022/09/15
6310
部署EFK pod日志分析系统
kubernetes日志收集方案
在kubernetes中对日志的处理方式叫做cluster-level-logging,即这个日志处理系统跟容器,Pod,Node的生命周期无关,也就是无论是容器挂了,Pod被删除了还是Node宕机了,应用的日志应该被正常获取到。
极客运维圈
2020/03/21
1.7K0
【每日一个云原生小技巧 #30】Fluentd 插件
Fluentd 插件是 Fluentd 生态系统的一个关键部分,提供了数据收集、处理和输出的灵活性。以下是关于 Fluentd 插件的详细介绍:
郭旭东
2023/11/24
2850
【每日一个云原生小技巧 #30】Fluentd 插件
Docker通过EFK(Elasticsearch + Fluentd + Kibana)查询日志
Elasticsearch是一个开源搜索引擎,以易用性着称。kibana是一个图形界面,可以在上面条件检索存储在ElasticSearch里数据,相当于提供了ES的可视化操作管理器。
py3study
2020/04/08
3.7K4
Kubernetes-基于EFK进行统一的日志管理
通过应用和系统日志可以了解Kubernetes集群内所发生的事情,对于调试问题和监视集群活动来说日志非常有用。对于大部分的应用来说,都会具有某种日志机制。因此,大多数容器引擎同样被设计成支持某种日志机制。对于容器化应用程序来说,最简单和最易接受的日志记录方法是将日志内容写入到标准输出和标准错误流。 但是,容器引擎或运行时提供的本地功能通常不足以支撑完整的日志记录解决方案。例如,如果一个容器崩溃、一个Pod被驱逐、或者一个Node死亡,应用相关者可能仍然需要访问应用程序的日志。因此,日志应该具有独立于Node、Pod或者容器的单独存储和生命周期,这个概念被称为群集级日志记录。群集级日志记录需要一个独立的后端来存储、分析和查询日志。Kubernetes本身并没有为日志数据提供原生的存储解决方案,但可以将许多现有的日志记录解决方案集成到Kubernetes集群中。在Kubernetes中,有三个层次的日志:
菲宇
2019/06/12
1.3K0
Kubernetes-基于EFK进行统一的日志管理
Kubernetes集群容器运行日志收集
Fluentd is deployed as a DaemonSet which spawns a pod on each node that reads logs, generated by kubelet, container runtime and containers and sends them to Elasticsearch. Fluentd被部署为一个守护进程集,在每个节点上生成一个pod,该pod读取由kubelet、容器运行时和容器生成的日志,并将它们发送到ElasticSearch。
三杯水Plus
2019/06/14
1.2K0
再见 Logstash,是时候拥抱下一代开源日志收集系统 Fluentd 了
fluentd 是一个实时的数据收集系统,不仅可以收集日志,还可以收集定期执行的命令输出和 HTTP 请求内容。数据被收集后按照用户配置的解析规则,形成一系列 event。每一个 event 包含如下内容:
iMike
2021/07/01
2.8K0
TKE搭建EFK日志服务
Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch、Fluentd 和 Kibana(EFK)技术栈,也是官方现在比较推荐的一种方案。
chen1900s
2022/06/09
1.3K0
Kubernetes集群监控-使用ELK实现日志监控和分析
日志对于调试问题和监视集群情况也是非常有用的。而且大部分的应用都会有日志记录,对于传统的应用大部分都会写入到本地的日志文件之中。对于容器化应用程序来说则更简单,只需要将日志信息写入到 stdout 和 stderr 即可,容器默认情况下就会把这些日志输出到宿主机上的一个 JSON 文件之中,同样也可以通过 docker logs 或者 kubectl logs 来查看到对应的日志信息。
王先森sec
2023/11/20
1K0
Kubernetes集群监控-使用ELK实现日志监控和分析
七, 跨语言微服务框架 - Istio日志采集EFK
ELK日志系统大家不会陌生(zipkin + jaeger , prometheus + grafana)解决了大家对于链路对于统计采集的需求,但是真正的对于日志进行存储还是得专业的上,在Istio中官方提供的方案是EFK(Fluentd + Elasticsearch + Kibana)Fluentd 是一个开源的日志收集器,支持多种数据输出并且有一个可插拔架构。 Elasticsearch是一个流行的后端日志记录程序, Kibana 用于查看。
喵了个咪233
2019/05/26
1.1K0
efk收集docker nginx日志
efk需要用到elasticsearch、fluentd以及kibana,nginx使用fluentd日志驱动将nginx docker日志转发到对应fluentd server端,fluentd server端将日志加工后传递到elasticsearch,存储到elasticsearch的数据就可以使用kibana展示出来。
johnhuster的分享
2022/03/28
6600
efk收集docker nginx日志
一文读懂开源日志管理方案 ELK 和 EFK 的区别
主流的 ELK (Elasticsearch, Logstash, Kibana) 目前已经转变为 EFK (Elasticsearch, Filebeat or Fluentd, Kibana) 比较重,对于容器云的日志方案业内也普遍推荐采用 Fluentd,我们一起来看下从 ELK 到 EFK 发生了哪些变化,与此同时我也推荐大家了解下 Grafana Loki
iMike
2021/01/08
12.3K0
在 Kubernetes中,fluentd 以 sidecar 模式收集日志,并发送至 ElasticSearch
ElasticSearch 在日志收集和分析领域非常流行,而 fluentd 是一种万用型的日志收集器,当然也支持 ES(ElasticSearch)。不过在 Kubnernetes 环境中,问题会变得有点复杂,问题在于是否要把 fluentd 放进跑业务代码的容器里:放在一起的话,fluentd 明显和业务无关;不放在一起的话,fluentd 又如何访问到跑业务容器里的日志呢。
用户2443625
2018/08/23
1.5K0
在 Kubernetes中,fluentd 以 sidecar 模式收集日志,并发送至 ElasticSearch
推荐阅读
相关推荐
Kubernetes 集群日志监控 EFK 安装
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验