日志分析新范式:手把手教你用Filebeat导入腾讯云ES

2024-08-26 18:37:12 浏览数 (2)

Filebeat简介

Filebeat 是 Elastic Stack 中的一部分,是用于转发和集中日志数据的轻量级传送器。它作为代理安装在您的服务器上,监控指定的日志文件或目录,收集日志事件,并将它们转发到 Elasticsearch 或 Logstash 进行索引和处理。

Filebeat的构成

Harvesters(收集器):Harvester 负责读取单个文件的内容,逐行读取每个文件,并将内容发送到输出。每个 harvester 对应一个文件,负责打开和关闭文件描述符,这意味着文件描述符在Harvester运行时保持打开状态。

如果在收集文件时删除或重命名文件,Filebeat 将继续读取该文件。这样做的副作用是,磁盘上的空间一直保留到 harvester 关闭。默认情况下,Filebeat 保持文件打开,直到达到 close_inactive。

Inputs(输入):Input 负责管理 harvester 并寻找所有来源读取。如果 input 类型是 log,则 input 将查找驱动器上与定义的路径匹配的所有文件,并为每个文件启动一个 harvester。每个 input 在它自己的 Go 进程中运行,Filebeat 当前支持多种输入类型。每个输入类型可以定义多次。日志输入检查每个文件,以查看是否需要启动 harvester、是否已经在运行 harvester 或是否可以忽略该文件。

Filebeat如何保证文件内容不丢失

保证文件内容不丢失,即所有内容至少发送一次:

  • Filebeat 使用 registry 来记录每个 harvester 最后读取到的文件偏移量(offset)。只有在数据成功发送后,Filebeat 才会更新 registry,否则会一直重试发送。
  • 如果运行中的 Filebeat 突然关闭,Filebeat 不会等待所有接受方确认完,而是立即关闭。等再次启动的时候,这部分内容会重新发送(至少发送一次)。

启动方式

代码语言:javascript复制
sudo ./filebeat -e -c filebeat.yml

Filebeat常见配置

代码语言:javascript复制
filebeat.inputs:
- type: log
  paths:
    - /root/logs/*.log
  symlinks: true
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - drop_fields:
      fields: ["ecs","icmp","igmp","agent","kafka","azure","input","stream","syslog","docker","process","host.id","fileset","host.os","host.mac","log.offset","user_agent","log.source","host.hostname","http.response","read_timestamp","host.architecture","host.containerized"]
      ignore_missing: true

setup.ilm.enabled: false
setup.template.enabled: false
output.elasticsearch:
  hosts: ['http://space-egsejxu8.ap-guangzhou.qcloudes.com:80']
  username: "elastic"
  password: "1L46-.be%*8cS@xf5I39"
  bulk_max_size: 2048
  compression_level: 5
  index: "zijian-egsejxu8"
  allow_older_versions: true

Input -- 输入源

常见的输入组件:Log、kafka、k8s、cvm 、docker、TCP、UDP

以 Log 为例:

基础配置

代码语言:javascript复制
filebeat.inputs:
// 类型log
- type: log
// 输入要采集日志的路径,支持同时采集多个
  paths:
    - /root/logs/*.log
    - /var/logs/access.log
  exclude_lines: ['vpc-(([a-z0-9]){8,8})']  

Configure inputs | Filebeat Reference [8.12] | Elastic

(复制下列链接至浏览器打开:https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html )

进阶配置

代码语言:javascript复制
symlinks:#符号链接选项允许filebeat除常规文件外,可以收集符号链接。收集符号链接时,即使报告了符号链接的路径,
encoding:#指定被监控的文件的编码类型,使用plain和utf-8都是可以处理中文日志
exclude_lines: ['vpc-(([a-z0-9]){8,8}'] #不包含匹配正则的行
include_lines: ['^ERR', '^WARN']  #包含匹配正则的行
exclude_files: ['.gz$']  #用于匹配希望filebeat忽略的文件的正则表达式列表

harvester_buffer_size: 16384 #每个harvester在获取文件时使用的缓冲区的字节大小,这部分根据业务可以进行调优
max_bytes: 10485760 #单个日志消息可以拥有的最大字节数。max_bytes之后的所有字节都被丢弃而不发送。默认值为10MB (10485760)
ingore_older: 0 #默认为0,表示禁用,可以配置2h,2m等;参数在filebeat配置中用于指定filebeat忽略文件中比指定时间更早的事件。这个参数的值通常使用时间格式来表示,例如1d表示一天,2h表示两小时,或者5m表示五分钟。当filebeat开始监控一个文件时,它会检查文件的修改时间,并忽略在ignore_older指定时间之前发生的事件;注意ignore_older必须大于close_inactive的值;用于减少数据量、提高性能
close_inactive:#是filebeat配置中的一个参数,它用于指定在harvester没有读取活动时,filebeat应该在多长时间后关闭并重新打开日志文件。这个参数的目的是确保filebeat能够在文件不再有新内容写入时释放资源,并在文件再次有新内容时重新打开文件以继续收集日志;当设置为0或者不设置时,filebeat将不会关闭不活动的文件;用于资源管理
tail_files:#如果设置为true,filebeat从文件尾开始监控文件新增内容,把新增的每一行文件作为一个事件依次发送,
harvester_limit:#harvester_limit选项限制一个prospector并行启动的harvester数量,直接影响文件打开数

multiline.pattern #必须匹配的regexp模式
multiline.negate #定义上面的模式匹配条件的动作是 否定的,默认是false假如模式匹配条件'^b',默认是false模式,表示讲按照模式匹配进行匹配 将不是以b开头的日志行进行合并如果是true,表示将不以b开头的日志行进行合并
multiline.match # 指定Filebeat如何将匹配行组合成事件,在之前或者之后,取决于上面所指定的negate
multiline.max_lines #可以组合成一个事件的最大行数,超过将丢弃,默认500
multiline.timeout #定义超时时间,如果开始一个新的事件在超时时间内没有发现匹配,也将发送日志,默认是5s
max_procs #设置可以同时执行的最大CPU数。默认值为系统中可用的逻辑CPU的数量。

Output -- 输出

常见的输出地址:ES、Logstash、Kafka、Redis

以输出腾讯云 ES Serverless 为例:

基础配置

代码语言:javascript复制
output.elasticsearch:
  hosts: ['http://space-egsejxu8.ap-guangzhou.qcloudes.com:80']
  username: "elastic"
  password: "1L46-.be%*8cS@xf5I39"
  #单个bulk API 索引请求中批量的最大事件数。默认值是 1600;增加批次大小可以通过降低发送事件的开销来提高性能,但过大的批次大小也可能增加处理时间,可能导致 API错误、连接被杀、发布请求超时,最终导致吞吐量降低。将 bulk_max_size 设置为 0 或负值将禁用批次分割
  bulk_max_size: 2048
  compression_level: 5
  index: "zijian-egsejxu8"
  allow_older_versions: true

Configure the output | Filebeat Reference [8.12] | Elastic

(复制下列链接至浏览器打开:https://www.elastic.co/guide/en/beats/filebeat/current/configuring-output.html )

进阶配置

代码语言:javascript复制
output.elasticsearch:
  hosts: ['http://space-egsejxu8.ap-guangzhou.qcloudes.com:80']
  username: "elastic"
  password: "1L46-.be%*8cS@xf5I39"
  indices:
    - index: "warning-%{[agent.version]}"
      when.contains:
        message: "WARN"
    - index: "error-%{[agent.version]}"
      when.contains:
        message: "ERR"
    - index: "%{[fields.log_type]}"
      mappings:
        critical: "sev1"
        normal: "sev2"
      default: "sev3"
        
pipeline: my_pipeline_id #可以输出到es中的某个pipeline,然后pilepline对数据进行处理,最后存入es,使用方式和存入某个index类似
max_retries:#filebeat的重试次数,默认无限次重试
backoff.init:#在网络错误后,filebeat等待多长时间再尝试重新连接到Elasticsearch。在等待backoff.init 秒后,filebeat尝试重新连接。如果连接尝试失败,退避计时器会按指数方式增加,直到 backoff.max。成功连接后,退避计时器被重置。默认值是 1s
timeout:#定义了 Elasticsearch 请求的HTTP请求超时时间,单位是秒。默认值是90秒

Processors -- 处理器

Dissect

代码语言:javascript复制
# dissect模块是一个处理器,它的作用是对日志数据进行解析和转换。dissect处理器使用预定义的模式来识别和提取日志行中的特定字段,并将这些字段作为单独的事件字段存储。这使得可以将复杂的日志格式转换为结构化的事件数据,便于后续的索引、搜索和分析
processors:
  - dissect:
      when:
          contains:
              message: "[SLOW_LOG]"
          tokenizer: "%{msg1} total_latency=%{total_latency}, upstream_latency=%{upstream_latency}, business_latency=%{business_latency}, %{msg2}"
          field: "message"
          target_prefix: ""

# 示例
echo '[SLOW_LOG] demofilebeat total_latency=1996, upstream_latency=996, business_latency=1000, end!' >> access.log

Drop_fields

代码语言:javascript复制
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - drop_fields:
      fields: ["total_latency"]
      ignore_missing: true

# 返回的结果:
{
  "_index": ".ds-zijian-egsejxu8-2024.03.24-000003",
  "_type": "_doc",
  "_id": "D8l1cY4BBQ5-GDn5KF94",
  "_score": 1,
  "_source": {
    "@timestamp": "2024-03-24T17:14:37.241Z",
    "ecs": {
      "version": "8.0.0"
    },
    "host": {
      "name": "VM-0-6-tencentos"
    },
    "business_latency": "1000",
    "total": {
      "latency": 1996
    },
    "business": {
      "latency": 1000
    },
    "log": {
      "offset": 5719,
      "file": {
        "path": "/root/logs/access.log"
      }
    },
    "message": "[SLOW_LOG] demofilebeat total_latency=1996, upstream_latency=996, business_latency=1000, end!",
    "input": {
      "type": "log"
    },
    "msg1": "[SLOW_LOG] demofilebeat",
    "agent": {
      "ephemeral_id": "19666091-b6d2-4998-ad62-6eabfebbcb96",
      "id": "5b126ba6-d763-4bb9-a658-984c60c17f87",
      "name": "VM-0-6-tencentos",
      "type": "filebeat",
      "version": "8.12.2"
    },
    "msg2": "end!",
    "upstream": {
      "latency": 996
    },
    "upstream_latency": "996"
  },
  "fields": {
    "msg2": [
      "end!"
    ],
    "msg1": [
      "[SLOW_LOG] demofilebeat"
    ],
    "upstream_latency": [
      "996"
    ],
    "business.latency": [
      1000
    ],
    "input.type": [
      "log"
    ],
    "log.offset": [
      5719
    ],
    "message": [
      "[SLOW_LOG] demofilebeat total_latency=1996, upstream_latency=996, business_latency=1000, end!"
    ],
    "upstream.latency": [
      996
    ],
    "business_latency": [
      "1000"
    ],
    "agent.type": [
      "filebeat"
    ],
    "@timestamp": [
      "2024-03-24T17:14:37.241Z"
    ],
    "agent.id": [
      "5b126ba6-d763-4bb9-a658-984c60c17f87"
    ],
    "ecs.version": [
      "8.0.0"
    ],
    "log.file.path": [
      "/root/logs/access.log"
    ],
    "agent.ephemeral_id": [
      "19666091-b6d2-4998-ad62-6eabfebbcb96"
    ],
    "agent.name": [
      "VM-0-6-tencentos"
    ],
    "agent.version": [
      "8.12.2"
    ],
    "host.name": [
      "VM-0-6-tencentos"
    ],
    "total.latency": [
      1996
    ],
    "log.file.path.keyword": [
      "/root/logs/access.log"
    ]
  }
}

可以看到 total_latency 这个字段被删除了,upstream_latency 这个字段依旧存在。

Convert

代码语言:javascript复制
# convert
processors:
  - convert:
      fields:
          - {from: "total_latency", to: "total.latency", type: "integer"}
          - {from: "upstream_latency", to: "upstream.latency", type: "integer"}
          - {from: "business_latency", to: "business.latency", type: "integer"}
      # ignore_missing是使用该processor出现错误的时候不进行报错,可以提高filebeat的健壮性
      ignore_missing: true
      fail_on_error: false

用了 Convert 之后可以将一些字段转换为特殊的特性,从而方便做一些操作;比如说转换为 Integer 类型之后,可以做范围查询。

Decode_json_fields

代码语言:javascript复制
# decode_json_fields
processors:
  - decode_json_fields:
      fields:
      - message
      max_depth: 1
      overwrite_keys: true
      

腾讯云Filebeat日志采集方案

对于需要采集并分析日志的场景,可以使用 Filebeat采集数据,然后传输到腾讯云 Elasticsearch Serverless中进行存储,之后可以在 Kibana 中查询并分析日志。本文介绍如何配置 Filebeat 采集部署在服务器上的服务日志。

优点

Filebeat 是一个轻量型的日志采集器,可以轻松地采集服务器上 的日志,从而使得查询或者分析业务服务端的日志变得简单。

Filebeat 能够逐行读取并发送日志,支持在出现中断的情况下,记录中断时读取到的文件位置信息,后续恢复正常后可以从中断前停止的位置继续开始。

Filebeat 非常适合采集 Nginx、Apache 以及容器服务的日志,并且提供可以直接引用的配置模板,极大的简化了这类服务的日志采集过程。

Filebeat 内置的processor具有强大的功能,比如 dissect 、drop_fields 、convert 等,在 Filebeat 介绍中对常见的 processor 进行详细介绍。

服务器部署Filebeat日志采集方案

一、部署条件

1、 一台服务器

2、 用户服务器和云上 vpc 网络相通

二、部署方案

方案:采集业务特定输出日志

1. 修改采集配置

修改 filebeat-path-diy.yaml 文件里的下述属性,以 node 主机路径作为过滤条件进行采集。

代码语言:javascript复制
printf("hello world!");filebeat.inputs:
// 类型log
- type: log
// 输入要采集日志的路径,支持同时采集多个
  paths:
    - /root/logs/*.log
    - /var/logs/access.log

2. 修改索引配置

根据索引详情页信息,修改 filebeat-path-diy.yaml 文件里的下述属性。

代码语言:javascript复制
    output.elasticsearch:
        hosts: ['http://space-6eiold1x.ap-guangzhou.qcloudes.com:80']  # 修改为项目空间内网访问地址和80端口号
        username: "elastic"                                            # 无须修改
        password: "xxxxxxx"                                            # 修改为对应用户密码 
        bulk_max_size: 2048                                            # 无须修改
        compression_level: 5                                           # 无须修改
        index: "old-index2-6eiold1x"                                   # 修改为索引名
        allow_older_versions: true                                     # 无须修改

3. 启动 Filebeat

代码语言:javascript复制
sudo ./filebeat -e -c filebeat.yml

K8S集群部署Filebeat日志采集方案

一、部署条件

1、 K8s 集群

2、 能连接 K8s 集群的 kubectl 客户端

3、 用户 K8s 集群和云上 vpc 网络相通

二、部署方案

采集有两种方式,第一种方式,采集业务日志输出(非/var/log/containers/下的标准输出日志),选择node的主机路径;第二种方式,采集标准输出(/var/log/containers/下的标准输出日志),选择空间、 label 等来指定 pod。

方案1:采集业务特定输出日志

1. 修改采集配置

修改 filebeat-path-diy.yaml 文件里的下述属性,以 node 主机路径作为过滤条件进行采集。

代码语言:javascript复制
# 修改日志采集路径,支持多个
    filebeat.inputs:
    - type: log
      paths:
        - /var/log/containers/1.log   # 改为node的主机路径,路径支持到文件
    - type: log
      paths:
        - /var/log/containers/*.txt   # 改为node的主机路径,路径支持通配符

2. 修改索引配置

根据索引详情页信息,修改 filebeat-path-diy.yaml 文件里的下述属性。

代码语言:javascript复制
    output.elasticsearch:
        hosts: ['http://space-6eiold1x.ap-guangzhou.qcloudes.com:80']  # 修改为项目空间内网访问地址和80端口号
        username: "elastic"                                            # 无须修改
        password: "xxxxxxx"                                            # 修改为对应用户密码 
        bulk_max_size: 2048                                            # 无须修改
        compression_level: 5                                           # 无须修改
        index: "old-index2-6eiold1x"                                   # 修改为索引名
        allow_older_versions: true                                     # 无须修改

3. DaemonSet 部署 Filebeat

代码语言:javascript复制
kubectl create -f filebeat-path-diy.yaml

方案2:采集标准输出日志

1. 修改采集配置

修改 filebeat-path-var.yaml 文件里的下述属性,以标签或者命名空间作为过滤条件进行采集

代码语言:javascript复制
# 1. 根据labels和namespace过滤pod
    filebeat.autodiscover:
      providers:
        - type: kubernetes
          node: ${NODE_NAME}
          templates:
            - condition.and:
                - or:  # 填写选择的空间和标签信息
                    - equals.kubernetes.namespace: default
                    - equals.kubernetes.namespace: kube-system
                - equals.kubernetes.labels.k8s-app: "kube-dns"
                - equals.kubernetes.labels.pod-template-hash: "56555dd999"
                
# 2. 选择所有空间所有pod,包含现存及未来   
    filebeat.autodiscover:
      providers:
        - type: kubernetes
          node: ${NODE_NAME}
          templates:
            - condition:
                regexp.kubernetes.namespace: ".*"                              

2. 修改索引配置

根据索引详情页信息,修改 filebeat-path-var.yaml 文件里的下述属性

代码语言:javascript复制
    output.elasticsearch:
        hosts: ['http://space-6eiold1x.ap-guangzhou.qcloudes.com:80']  # 修改为空间的内网访问地址和80端口号
        username: "elastic"                                            # 无须修改
        password: "xxxxxxx"                                            # 修改为对应用户密码 
        bulk_max_size: 2048                                            # 无须修改
        compression_level: 5                                           # 无须修改
        index: "old-index2-6eiold1x"                                   # 修改为索引名
        allow_older_versions: true                                     # 无须修改

3. DaemonSet 部署 Filebeat

代码语言:javascript复制
kubectl create -f filebeat-path-var.yaml

总结

本文简单介绍了如何利用 Filebeat轻量级日志收集器,高效地将业务日志导入腾讯云的 ES Serverless 服务。Filebeat 以其轻量级和灵活性,成为日志收集的首选工具之一。结合腾讯云 ES Serverless 的一站式日志采集解决方案,用户可以轻松实现日志数据的集中管理和分析,无需担心基础设施的维护和扩展问题。文章中提供的一键部署功能,极大地简化了 Filebeat 的部署流程,使得即使是初学者也能快速上手。我们通过实际操作案例,向读者展示了从配置 Filebeat 到日志数据成功导入腾讯云ES的完整流程。使用 Filebeat 和腾讯云 ES Serverless,用户不仅可以节省时间和资源,还可以利用强大的搜索和分析能力,从日志中获得宝贵的业务洞察。随着日志管理和分析技术的不断进步,我们期待未来能为用户带来更多创新和便利。

0 人点赞