当前位置: 首页 > article >正文

【Beats02】企业级日志分析系统ELK之Filebeat 收集日志及案例一

利用 Filebeat 收集日志

Filebeat 是用于转发和集中日志数据的轻量级传送程序。作为服务器上的代理安装,Filebeat监视您指定 的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或Logstash进行索引。

Logstash 也可以直接收集日志,但需要安装JDK并且会占用至少500M 以上的内存

生产一般使用filebeat代替logstash, 基于go开发,部署方便,重要的是只需要10M多内存,比较节约资源.

filebeat 支持从日志文件,Syslog,Redis,Docker,TCP,UDP,标准输入等读取数据,对数据做简单处理,再输 出至Elasticsearch,logstash,Redis,Kafka等

Filebeat的工作方式如下:

  • 启动Filebeat时,它将启动一个或多个输入源,这些输入将在为日志数据指定的位置中查找。

  • 对于Filebeat所找到的每个日志,Filebeat都会启动收集器harvester进程。

  • 每个收集器harvester都读取一个日志以获取新内容,并将新日志数据发送到libbeat

  • libbeat会汇总事件并将汇总的数据发送到为Filebeat配置的输出。

        

Filebeat 官方说明

https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html
https://www.elastic.co/guide/en/beats/filebeat/current/configuring-howto-filebeat.html 

输入和输入官方说明

 

https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html
https://www.elastic.co/guide/en/beats/filebeat/current/configuring-output.html

注意: Filebeat 支持多个输入,但不支持同时有多个输出,如果多输出,会报错如下

Exiting: error unpacking config data: more than one namespace configured 
accessing 'output' (source:'/etc/filebeat/stdout_file.yml')

 

安装 Filebeat 和配置说明

下载链接

Download Filebeat • Lightweight Log Analysis | Elastic

安装 Filebeat
#新版下载
[root@elk-web1 ~]#wget 
https://mirrors.tuna.tsinghua.edu.cn/elasticstack/8.x/apt/pool/main/f/filebeat/filebeat-8.6.1-amd64.deb
#旧版下载
[root@elk-web1 ~]#wget 
https://mirrors.tuna.tsinghua.edu.cn/elasticstack/7.x/apt/pool/main/f/filebeat/filebeat-7.6.2-amd64.deb
#安装
[root@elk-web1 ~]#dpkg -i filebeat-7.6.2-amd64.deb
#默认没有启动
[root@elk-web1 ~]#systemctl enable --now filebeat
#filebeat以root身份启动
[root@elk-web1 ~]#systemctl start filebeatps aux|grep filebeat
#先停止服务,方便后续调试
[root@elk-web1 ~]#systemctl stop filebeat
Filebeat 配置

配置文件官方说明

https://www.elastic.co/guide/en/beats/filebeat/current/configuring-howto-filebeat.html
https://www.elastic.co/guide/en/beats/filebeat/8.3/configuration-general-options.html 

Filebeat的 默认配置文件是/etc/filebeat/filebeat.yml,遵循YAML语法。常见配置包括如下

  • Filebeat

  • Output

  • Shipper

  • Logging(可选)

  • Run Options(可选)

filebeat.yml的格式说明

input_type: log
#指定输入类型

paths
#支持基本的正则,所有golang glob都支持,支持/var/log/*/*.log

encoding
#plain, latin1, utf-8, utf-16be-bom, utf-16be, utf-16le, big5, gb18030, gbk, hz-gb-2312,euc-kr, euc-jp, iso-2022-jp, shift-jis, and so on 

exclude_lines
#支持正则 排除匹配的行,如果有多行,合并成一个单一行来进行过滤

include_lines
#支持正则 include_lines执行完毕之后会执行exclude_lines。

exclude_files
#支持正则 排除匹配的文件
exclude_files: ['.gz$']

tags
#列表中添加标签,用过过滤
filebeat.inputs:
- paths: ["/var/log/app/*.json"]
tags: ["json"]

fields
#可选字段,选择额外的字段进行输出
#可以是标量值,元组,字典等嵌套类型

ignore_older
#可以指定Filebeat忽略指定时间段以外修改的日志内容
#文件被忽略之前,确保文件不在被读取,必须设置ignore older时间范围大于close_inactive
#如果一个文件正在读取时候被设置忽略,它会取得到close_inactive后关闭文件,然后文件被忽略

close_*
#close_ *配置选项用于在特定标准或时间之后关闭harvester。 关闭harvester意味着关闭文件处理程序。 如果在harvester关闭后文件被更新,则在scan_frequency过后,文件将被重新拾取。 但是,如果在harvester关闭时移动或删除文件,Filebeat将无法再次接收文件,并且harvester未读取的任何数据都将丢失。

close_inactive
#启动选项时,如果在制定时间没有被读取,将关闭文件句柄
#读取的最后一条日志定义为下一次读取的起始点,而不是基于文件的修改时间
#如果关闭的文件发生变化,一个新的harverster将在scan_frequency运行后被启动
#建议至少设置一个大于读取日志频率的值,配置多个prospector来实现针对不同更新速度的日志文件
#使用内部时间戳机制,来反映记录日志的读取,每次读取到最后一行日志时开始倒计时
#使用2h 5m 来表示

recursive_glob.enabled 
#递归匹配日志文件,默认false

close_rename
#当选项启动,如果文件被重命名和移动,filebeat关闭文件的处理读取

close_removed
#当选项启动,文件被删除时,filebeat关闭文件的处理读取
#这个选项启动后,必须启动clean_removed

close_eof
#适合只写一次日志的文件,然后filebeat关闭文件的处理读取

close_timeout
#当选项启动时,filebeat会给每个harvester设置预定义时间,不管这个文件是否被读取,达到设定时间后,将被关闭

close_timeout 不能等于ignore_older,会导致文件更新时,不会被读取
#如果output一直没有输出日志事件,这个timeout是不会被启动的,至少要要有一个事件发送,然后haverter将被关闭
#设置0 表示不启动

clean_inactived
#从注册表文件中删除先前收获的文件的状态
#设置必须大于ignore_older+scan_frequency,以确保在文件仍在收集时没有删除任何状态
#配置选项有助于减小注册表文件的大小,特别是如果每天都生成大量的新文件
#此配置选项也可用于防止在Linux上重用inode的Filebeat问题

clean_removed
#启动选项后,如果文件在磁盘上找不到,将从注册表中清除filebeat
#如果关闭close removed 必须关闭clean removed

scan_frequency
#prospector检查指定用于收获的路径中的新文件的频率,默认10s

document_type
#类型事件,被用于设置输出文档的type字段,默认是log

 

harvester_buffer_size
#每次harvester读取文件缓冲字节数,默认是16384

max_bytes
#对于多行日志信息,很有用,最大字节数

json
#这些选项使Filebeat解码日志结构化为JSON消息,逐行进行解码json

keys_under_root
#设置key为输出文档的顶级目录

overwrite_keys
#覆盖其他字段

add_error_key
#定义一个json_error

message_key
#指定json 关键建作为过滤和多行设置,与之关联的值必须是string

multiline
#控制filebeat如何处理跨多行日志的选项,多行日志通常发生在java堆栈中
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
上面匹配是将多行日志所有不是以[符号开头的行合并成一行它可以将下面的多行日志进行合并成一行

multiline.pattern
指定匹配的正则表达式,filebeat支持的regexp模式与logstash支持的模式有所不同

pattern regexp
multiline.negate
定义上面的模式匹配条件的动作是 否定的,默认是false
假如模式匹配条件'^b',默认是false模式,表示讲按照模式匹配进行匹配 将不是以b开头的日志行进行合并
如果是true,表示将不以b开头的日志行进行合并
multiline.match
#指定Filebeat如何将匹配行组合成事件,在之前或者之后,取决于上面所指定的negate

multiline.max_lines
#可以组合成一个事件的最大行数,超过将丢弃,默认500

multiline.timeout
#定义超时时间,如果开始一个新的事件在超时时间内没有发现匹配,也将发送日志,默认是5s

tail_files
#如果此选项设置为true,Filebeat将在每个文件的末尾开始读取新文件,而不是开头
#此选项适用于Filebeat尚未处理的文件

symlinks
#符号链接选项允许Filebeat除常规文件外,可以收集符号链接。收集符号链接时,即使为符号链接的路径,Filebeat也会打开并读取原始文件。

backoff
#backoff选项指定Filebeat如何积极地抓取新文件进行更新。默认1s
#backoff选项定义Filebeat在达到EOF之后再次检查文件之间等待的时间。

max_backoff
#在达到EOF之后再次检查文件之前Filebeat等待的最长时间

backoff_factor
#指定backoff尝试等待时间几次,默认是2

harvester_limit
#harvester_limit选项限制一个prospector并行启动的harvester数量,直接影响文件打开数

enabled
#控制prospector的启动和关闭

filebeat global
spool_size
#事件发送的阀值,超过阀值,强制刷新网络连接
filebeat.spool_size: 2048

publish_async
#异步发送事件,实验性功能

idle_timeout
#事件发送的超时时间,即使没有超过阀值,也会强制刷新网络连接
filebeat.idle_timeout: 5s

registry_file
#注册表文件的名称,如果使用相对路径,则被认为是相对于数据路径
#有关详细信息,请参阅目录布局部分 默认值为${path.data}/registry
filebeat.registry_file: registry

config_dir
#包含额外的prospector配置文件的目录的完整路径
#每个配置文件必须以.yml结尾
#每个配置文件也必须指定完整的Filebeat配置层次结构,即使只处理文件的prospector部分。
#所有全局选项(如spool_size)将被忽略
#必须是绝对路径
filebeat.config_dir: path/to/configs

shutdown_timeout
#Filebeat等待发布者在Filebeat关闭之前完成发送事件的时间。

Filebeat General
name
#设置名字,如果配置为空,则用该服务器的主机名
name: "my-shipper"

queue_size
#单个事件内部队列的长度 默认1000

bulk_queue_size
#批量事件内部队列的长度

max_procs
#设置最大使用cpu数量

 范例:添加新字段

#默认配置文件中添加新字段
vim /etc/filebeat/filebeat.yml
- type : log
  enabled: true
  paths:
    - /var/log/syslog
  fields:
    project: test-syslog         #添加fields.project和fields.env字段,可用于区分不同的日志
    env: test  
  tags: ["syslog","test"]     #添加标签,也可以用于区分不同的日志   

案例: 从标准输入读取再输出至标准输出

创建配置
[root@elk-web1 ~]#vim /etc/filebeat/stdin.yml 
filebeat.inputs:
- type: stdin
  enabled: true
#output.console:
#  pretty: true
#  enable: true
output.console:
  pretty: true
  enable: true
#语法检查
[root@ubuntu2204 ~]#filebeat test config  -c stdin.yml
Config OK
执行读取
#从指定文件中读取配置 
#-e 表示Log to stderr and disable syslog/file output
[root@elk-web1 ~]#filebeat -e -c /etc/filebeat/stdin.yml
#下面命令默认就会从/etc/filebeat/目录中加载stdin.yml文件,而非当前目录
[root@elk-web1 ~]#filebeat -e -c stdin.yml
.....
hello,es  #输入信后再回车,输出如下

案例: 从标准输入读取再输出至 Json 格式的文件

创建配置

[root@elk-web1 ~]#vim /etc/filebeat/stdout_file.yml
filebeat.inputs:
- type: stdin
  enabled: true
  json.keys_under_root: true #默认False会将json数据存储至message,true则会将数据以独立字段存储,并且删除message字段,如果是文本还是放在message字段中
output.file:
  path: "/tmp"
  filename: "filebeat.log" 

执行读取

[root@elk-web1 ~]#filebeat -e -c /etc/filebeat/stdout_file.yml 
.....
#输入如下Json格式信息,再回车后输出如下
{"name" : "wangxiaochun", "age" : "18", "phone" : "0123456789"}

[root@elk-web1 ~]#cat /tmp/filebeat.log

#Json格式整理
[root@elk-web1 ~]#apt -y install jq

#8.X版本生成的文件名,json.keys_under_root: false

[root@elk-web1 ~]#cat /tmp/filebeat.log-20230217.ndjson  |jq

#8.X版本生成的文件名,json.keys_under_root: true
[root@elk-web1 ~]#cat /tmp/filebeat.log-20230217-1.ndjson|jq

 

案例: 从文件读取再输出至标准输出

https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.htmlicon-default.png?t=O83Ahttps://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html  filebeat 会将每个文件的读取数据的相关信息记录在/var/lib/filebeat/registry/filebeat/log.json文 件中,可以实现日志采集的持续性,而不会重复采集

创建配置
[root@elk-web1 ~]#vim /etc/filebeat/file.yml 
filebeat.inputs:
- type: log
  enabled: true
  paths:
  #- /var/log/syslog
  - /var/log/test.log
output.console:
  pretty: true
  enable: true

 

执行读取
[root@elk-web1 ~]#filebeat -e -c /etc/filebeat/file.yml  
......
#执行生成文件内容后echo hello,wang > /var/log/test.log以看到下面的输出信息

#filebeat记录日志文件读取的当前位置,以防止重复读取日志
[root@ubuntu2204 ~]#cat  /var/lib/filebeat/registry/filebeat/log.json

案例: 利用 Filebeat 收集系统日志到 ELasticsearch

 https://www.elastic.co/guide/en/beats/filebeat/current/elasticsearch-output.htmlicon-default.png?t=O83Ahttps://www.elastic.co/guide/en/beats/filebeat/current/elasticsearch-output.html

  Filebeat收集的日志在Elasticsearch中默认生成的索引名称为

#新版
.ds-filebeat-<版本>-<时间>-<ID>
#旧版
filebeat-<版本>-<时间>-<ID>

修改配置
插件查看索引

测试用ssh登录,用插件查看日志

注意:8.X版后索引名默认为.ds-filebeat--

新版

 

 旧版

通过 Kibana 查看收集的日志信息

新版

  1. Stack Management

  2. 数据视图

  3. 创建数据视图

旧版

  1. 管理

  2. 索引模式

  3. 创建索引模式

案例: 自定义索引名称收集日志到 ELasticsearch

修改配置

范例:自定义索引名称收集所有系统日志到 ELasticsearch

[root@elk-web1 ~]#vi /etc/rsyslog.conf
.....
*.*  /var/log/system.log
[root@elk-web1 ~]#systemctl restart rsyslog
[root@elk-web1 ~]#vim /etc/filebeat/filebeat.yml 
filebeat.inputs:
- type: log
  enabled: true                       #开启日志 
  paths:- /var/log/system.log               #指定收集的日志文件
  include_lines: ['sshd','failed', 'password']  #只过滤指定包含关健字的日志
  #include_lines: ['^ERR', '^WARN']  #只过滤指定包含关健字的日志
  #exclude_lines: ['Debug']           #排除包含关健字的日志
  #exclude_files: ['.gz$']            #排除文件名包含关健字的日志文件
output.elasticsearch:
  hosts: ["10.0.0.101:9200"]        #指定ES集群服务器地址和端口
  index: "wang-%{[agent.version]}-%{+yyyy.MM.dd}" #自定义索引名称,agent.version是filebeat添加的元数据字段
  #注意: 8.X版生成的索引名为 .ds-wang-%{[agent.version]}-日期-日期-00000n
  #注意:如果自定义索引名称,没有添加下面三行的配置会导致filebeat无法启动,提示错误日志如下
  filebeat:Exiting: setup.template .name and setup.template .pattern have to be 
  set if index name is modifiedsystemd: filebeat.service: main process exited, 
  code=exited,status=1/FAILURE
  
setup.ilm.enabled: false #关闭索引生命周期ilm功能,默认开启时索引名称只能为filebeat-*,自定义索引名必须修改为false
setup.template.name: "wang" #定义模板名称,要自定义索引名称,必须指定此项,否则无法启动
setup.template.pattern: "wang-*" #定义模板的匹配索引名称,要自定义索引名称,必须指定此项,否则无法启动
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 1

默认情况下 Filebeat 写入到 ES 的索引分片为1,副本数为1,如果需要修改分片和副本数,可以通过如 下实现

 

#方法1,修改filebeat.yml配置文件,此方式只适合直接连接ES时才有效,适用度不高
#注意:如果模板已经存在,需要先删除模板和索引才能生效,利用kibana或者cerebro(8.X不支持)插件
(more--index templates--existing templates--输入搜索的模板名wang)
vim /etc/filebeat/filebeat.yml
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 1
  
#生效后,在cerebro插件中more--index templates--existing templates--输入搜索的模板名
wang 中可以看到以下的分片和副本配置,8.X不支持
#settings中number_of_shards和number_of_replication  

#方法2:也可以通过修下面方式修改,8.X不支持
1.停止filebeat服务
2.在cerebro web页面修改:修改模板settings 配置,调整分片以及副本
3.删除模板关联的索引
4.启动filebeat产生新的索引

 范例: 自定义索引名称收集Nginx日志到 ELasticsearch

[root@elk-web1 ~]#apt update && apt -y install nginx

[root@elk-web1 ~]#vim /etc/filebeat/filebeat.yml 
filebeat.inputs:
- type: log
  enabled: true                             #开启日志
  paths:
  - /var/log/nginx/access.log        #指定收集的日志文件   
              		
output.elasticsearch:
  hosts: ["10.0.0.101:9200"]			#指定ES集群服务器地址和端口
  index: "nginx-access-%{[agent.version]}-%{+yyyy.MM.dd}" #自定义索引名称
setup.ilm.enabled: false
setup.template.name: "nginx" #定义模板名称,要自定义索引名称,必须指定此项,否则无法启动
setup.template.pattern: "nginx-*" #定义模板的匹配索引名称,要自定义索引名称,必须指定此项,否则无法启动
启动服务

[root@elk-web1 ~]#systemctl enable --now filebeat.service


http://www.kler.cn/a/456922.html

相关文章:

  • SWM221系列芯片之电机应用及控制
  • Docker搭建Skywalking
  • 如何在 Ubuntu 22.04 上安装 Varnish HTTP 教程
  • FreeRTOS的内存管理(选择heap4.c文件的理由)
  • 闲谭Scala(2)--安装与环境配置
  • 【2024年-7月-13日-开源社区openEuler实践记录】探索 CPM4OSSP-UI:提升用户交互体验的开源宝藏
  • 机器视觉中的单线程、多线程与跨线程:原理与应用解析
  • 前端HTMLCSS
  • Eclipse 添加书签
  • 【SpringMVC】Bean 加载控制
  • 关于easy-es对时间范围查询遇到的小bug
  • 基于springboot校园志愿者管理系统源码和论文
  • Prompt提示工程上手指南(七)Prompt编写实战-基于智能客服问答系统下的Prompt编写
  • spring cloud微服务-OpenFeign的使用
  • AI主流向量数据库整理
  • 基于规则的系统架构:理论与实践
  • C语言中的贪心算法
  • BigDecimal解决精度问题
  • 【git】将项目上传到github、gitee
  • 【蓝桥杯每日一题】与或异或——DFS
  • 【Docker命令】如何使用 `docker cp` 命令拷贝容器文件到宿主机
  • Dify智能体进阶:Selenium截取动图
  • Git完整使用经历
  • 0基础带你python入门:pyQT + OpenCV相关练习
  • 调试文件系统(DebugFS )
  • Flutter 实现全局悬浮按钮学习