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,用户不仅可以节省时间和资源,还可以利用强大的搜索和分析能力,从日志中获得宝贵的业务洞察。随着日志管理和分析技术的不断进步,我们期待未来能为用户带来更多创新和便利。