filebeat生产环境配置

news2024/9/21 0:37:12

配置文件属性

生产配置

filebeat.inputs: 
- type: log
  enabled: true
  paths: 
  - /tmp/logs/*.log
  - /var/log/system.log
  - /var/log/wifi.log
  symlinks: true
  json.keys_under_root: true
  json.message_key: xxx
  json.add_error_key: true
  # 如果想卡部分日志,比如用时间作为过滤条件,加上下面两个选项,一个是时间筛选,一个是句柄是否关闭
  ignore_older: 168h
  close_inactive: 24h
  
  multiline.pattern: '^\s+|^"'
  multiline.match: after
  fields:
    type: fb-urmp-xx-test
  fields_under_root: true
output.console:
  pretty: true

参数释义

paths

待收集日志的路径列表

symlinks

使用 symlinks 属性的主要场景包括:

  1. 日志轮转:有些日志轮转工具会创建符号链接指向最新的日志文件。启用 symlinks 后,Filebeat 可以确保收集到最新的日志内容。
  2. 一致性路径:在一些系统中,符号链接可能用于统一路径,而实际文件位置可能会变化。通过设置 symlinks,Filebeat 可以稳定地读取这些符号链接指向的日志文件。

假设你有一个应用程序,它生成的日志文件在 /var/log/myapp/ 目录下,并且有一个日志轮转机制。轮转机制会将旧日志重命名并创建一个符号链接指向最新的日志文件,如下所示:

/var/log/myapp/
├── myapp.log -> myapp.log.20240628
├── myapp.log.20240626
├── myapp.log.20240627
└── myapp.log.20240628

在上面的结构中,myapp.log 是一个符号链接,指向 myapp.log.20240628,这是最新的日志文件。

不使用 symlinks

如果你在 Filebeat 配置中没有启用 symlinks

这种情况下,Filebeat 只会读取实际的日志文件,即 myapp.log.20240626myapp.log.20240627myapp.log.20240628,不会读取 myapp.log(符号链接)。如果日志轮转机制仅更新符号链接而不生成新文件,Filebeat 可能会漏掉最新的日志数据。

如果你在 Filebeat 配置中启用了 symlinks

这种情况下,Filebeat 不仅会读取实际的日志文件 myapp.log.20240626myapp.log.20240627myapp.log.20240628,还会读取 myapp.log 所指向的最新日志文件 myapp.log.20240628。这样,即使日志轮转机制只更新符号链接,Filebeat 也能获取到最新的日志内容。

json_xxx

json.keys_under_root

这个属性用于指定 JSON 键是否应该被解析为顶级字段。当设置为 true 时,意味着 JSON 对象中的所有键都将被解析为顶级字段,而不是嵌套在 message 字段下,并且没有message字段了

比如,我现在日志目录里面生成一条json日志:

{"timestamp":"2024-06-28T12:00:00Z","loglevel":"INFO444","logs":"User logged in"}

使用之后:

{
  "@timestamp": "2024-06-28T09:44:06.150Z",
  ...,
  ...,
  "timestamp": "2024-06-28T12:00:00Z",
  "loglevel": "INFO444",
  "logs": "User logged in",
  "input": {
    "type": "log"
  },
  ...,
}
json.add_error_key

当设置为 true 时,如果 JSON 解析过程中出现错误,Filebeat 会在输出中添加一个 json_error 键,并将错误信息存储在这个键下。这有助于调试和识别解析错误。

比如,我现在日志目录里面生成一条json日志:(注意看,不符合json规范)

{"timestamp":"2024-06-28T12:00:00Z","loglevel":"INFO444","logs":"User logged in

设置json.add_error_key: true

效果:

{
  "@timestamp": "2024-06-28T09:45:29.164Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.16.3"
  },
  ...,
  //看这里,解析错误会多生成这个
  "error": {
    "message": "Error decoding JSON: invalid character '\\n' in string literal",
    "type": "json"
  },
  "message": "{\"timestamp\":\"2024-06-28T12:00:00Z\",\"loglevel\":\"INFO444\",\"logs\":\"User logged in"
}
json.message_key

建议搭配json.add_error_key: true来使用

使用这个属性的话,采集的日志没有message字段

这个值用来 在解析json错误的时候,将日志的源值添加到这个字段中

json.message_key 设置一个日志原值已经存在的字段,如果json解析正常的话,那么该属性继续显示日志原值的值

如果设置一个日志原值已经不存在的字段json解析正常的话,那么该属性的值为空串

如果解析失败的话,那么就会将日志的原值添加到这个字段中

比如日志原值为:

{"timestamp":"2024-06-28T12:00:00Z","loglevel":"INFO444","logs":"User logged in"}
设置json.message_key:logs的话,json解析正常的话,没有用,但是filbeat采集的日志没有message字段
设置json.message_key:test的话,json解析正常的话,fileat采集的日志多出一个test字段,但是test为空串,没有message字段

比如我设置为 json.message_key: logs,json.add_error_key: true

那么我日志里面生成一条数据

{"timestamp":"2024-06-28T12:00:00Z","loglevel":"INFO444","logs":"User logged in

filebeat采集的信息为:

{
  "@timestamp": "2024-06-28T09:57:15.426Z",
  ...,
  //看这里,logs存储的是日志的原值
  "logs": "{\"timestamp\":\"2024-06-28T12:00:00Z\",\"loglevel\":\"INFO444\",\"logs\":\"User logged in",
  "log": {
    "offset": 7704,
    "file": {
      "path": "/tmp/logs/urmp-manager.log"
    }
  },
  ...,
}

如果日志json正确解析的话,filebeat采集的日志为:

{
  "@timestamp": "2024-06-28T10:10:19.555Z",
  ...,
  "loglevel": "INFO444",
  ...,
  "logs": "User logged in",
  "timestamp": "2024-06-28T12:00:00Z",
  "input": {
    "type": "log"
  }
...
}

multiline_xx

multiline.pattern

指定用于匹配多行的正则表达式

multiline.match

multiline.pattern: ‘^\s’
multiline.match: after

指定Filebeat如何把多行合并成一个事件。可选的值是 after 或者 before

如果match=after,则以空格开头的和前面一行将合并成一条完整日志;如果 match=before,则以 空格 开头的和后面一行将合并成一条完整日志。

multiline.negate

默认为false,表示匹配pattern的行合并到上一行;true表示不匹配pattern的行合并到上一行;

假如

multiline.pattern: ‘^\s’
multiline.match: after

源日志的内容为:

{"timestamp": "2024-07-09 16:45:23.650","traceId": "[SW_CTX:[test::urmp-manager,urmp-manager-test-75564f678c-swvmg,d529c220b9a045a98e5eb9ea233ac90d.165.17205147234650001,d529c220b9a045a98e5eb9ea233ac90d.165.17205147234650000,0]]","level": "ERROR","service": "urmp-manager", "thread": "http-nio-8080-exec-4", "class": "com.hero.commons.core.handlers.MyExceptionHandler", "msg": "error", "exception":"com.hero.commons.core.exception.MyCustomException: 系统错误
	at com.hero.commons.core.handlers.MyExceptionHandler.handleException(MyExceptionHandler.java:160)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
	at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:413)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:74)
" }

如果multiline.negate:true

那么采集的日志内容为:

{
  ...
  "error": {
    "message": "Error decoding JSON: invalid character 'a' looking for beginning of value",
    "type": "json"
  },
  "ori": "\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)",
  "fb_collect_app": "urmp-manager-test"
}
{
 ...
  "ori": "\tat org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:413)",
  "system_env": "test",
}
{
  ...
  "ori": "\tat org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:74)\n\" }",
}

注意看
源日志最后一行" }规则不符合pattern的格式,所以他合并到上一行了,其他符合的并没有合并到上一行

如果multiline.negate:false

采集的日志为

{
 ...,
  "ori": "{\"timestamp\": \"2024-07-09 17:01:48.143\",\"traceId\": \"[SW_CTX:[test::urmp-manager,urmp-manager-test-6db7b7b7bf-5rmvc,77065c0d2a864a28b9a2802143f5b690.166.17205157080370001,77065c0d2a864a28b9a2802143f5b690.166.17205157080370000,0]]\",\"level\": \"ERROR\",\"service\": \"urmp-manager\", \"thread\": \"http-nio-8080-exec-5\", \"class\": \"com.hero.commons.core.handlers.MyExceptionHandler\", \"msg\": \"error\", \"exception\":\"com.hero.commons.core.exception.MyCustomException: 系统错误\n\tat com.hero.commons.core.handlers.MyExceptionHandler.handleException(MyExceptionHandler.java:160)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152)\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\n\tat org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:413)\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:74)",
 ...
}
multiline.pattern

指定一个正则表达式,多行将从内存刷新到磁盘

multiline.max_lines

可以合并成一个事件的最大行数。如果一个多行消息包含的行数超过max_lines,则超过的行被丢弃。默认是500。

fields

topic 对应的消息字段或自定义增加的字段

fields_under_root

如果值为ture,那么fields存储在输出文档的顶级位置

document_type

跟fields字段意思差不多,fields是用来替换他的,他是早期的产物

exclude_lines

exclude_lines: [‘^DBG’] #不包含匹配正则的行

include_lines

include_lines: [‘^ERR’, ‘^WARN’] #包含匹配正则的行

close_inactive

启动选项时,如果在制定时间没有被读取,将关闭文件句柄

ingore_older

#默认为0,表示禁用,可以配置2h,2m等,注意ignore_older必须大于close_inactive的值。

表示忽略超过设置值未更新的文件或者文件从来没有被harvester收集

filebeat工作原理

filebeat结构:由两个组件构成,分别是inputs(输入)和harvesters(收集器),这些组件一起工作来跟踪文件并将事件数据发送到您指定的输出,harvester负责读取单个文件的内容。harvester逐行读取每个文件,并将内容发送到输出。为每个文件启动一个harvester。harvester负责打开和关闭文件,这意味着文件描述符在harvester运行时保持打开状态。如果在收集文件时删除或重命名文件,Filebeat将继续读取该文件。这样做的副作用是,磁盘上的空间一直保留到harvester关闭。默认情况下,Filebeat保持文件打开,直到达到close_inactive

关闭harvester可以会产生的结果:

  • 文件处理程序关闭,如果harvester仍在读取文件时被删除,则释放底层资源。
  • 只有在scan_frequency结束之后,才会再次启动文件的收集。
  • 如果该文件在harvester关闭时被移动或删除,该文件的收集将不会继续

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

Filebeat目前支持两种prospector类型:log和stdin。

Filebeat如何保持文件的状态?

Filebeat保留每个文件的状态,并经常将状态刷新到磁盘中的注册表文件中。该状态用于记住harvester读取的最后一个偏移量,并确保发送所有日志行。如果无法访问输出(如Elasticsearch或Logstash),Filebeat将跟踪最后发送的行,并在输出再次可用时继续读取文件。当Filebeat运行时,每个输入的状态信息也保存在内存中。当Filebeat重新启动时,来自注册表文件的数据用于重建状态,Filebeat在最后一个已知位置继续每个harvester。对于每个输入,Filebeat都会保留它找到的每个文件的状态。由于文件可以重命名或移动,文件名和路径不足以标识文件。对于每个文件,Filebeat存储唯一的标识符,以检测文件是否以前被捕获。

filebeat何如保证至少一次数据消费

Filebeat保证事件将至少传递到配置的输出一次,并且不会丢失数据。是因为它将每个事件的传递状态存储在注册表文件中。在已定义的输出被阻止且未确认所有事件的情况下,Filebeat将继续尝试发送事件,直到输出确认已接收到事件为止。如果Filebeat在发送事件的过程中关闭,它不会等待输出确认所有事件后再关闭。当Filebeat重新启动时,将再次将Filebeat关闭前未确认的所有事件发送到输出。这样可以确保每个事件至少发送一次,但最终可能会有重复的事件发送到输出。通过设置shutdown_timeout选项,可以将Filebeat配置为在关机前等待特定时间

工作流程图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1941304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Monaco 使用 HoverProvider

Monaco 中自定义 Hover,Hover 效果是指当鼠标移动文字上展示出提示效果,就像页面上的 Tooltip 效果。最终页面的显示效果如下: 通过 registerHoverProvider 注册 Hover 触发时的处理方法 接口中提供了 4 个参数,前两个参数比较重…

python学习之闭包与装饰器

一、闭包 闭包允许一个函数访问并操作函数外部的变量(即父级作用域中的变量),即使在该函数外部执行。 特性: (1)外部函数嵌套内部函数。 (2)外部函数可以返回内部函数。 (3)内部函数可以访问外部函数的局部变量。 def out()…

【jmeter边界值提取器】

【目的】 从响应头中取token的内容 【方案】 使用后置处理器-边界值提取器 【组件路径】HTTP请求->右键添加->后置处理器->边界提取器 用途:边界提取器(Boundary Extractor)是放在Sample请求之后执行的,用于获取左右边界中间的所有字符&#xf…

Windows配置Qt+VLC

文章目录 前言下载库文件提取文件编写qmakeqtvlc测试代码 总结 前言 在Windows平台上配置Qt和VLC是开发多媒体应用程序的一个重要步骤。Qt作为一个强大的跨平台应用开发框架,为开发人员提供了丰富的GUI工具和库,而VLC则是一个开源的多媒体播放器&#x…

基于STM32的农业大棚温湿度采集控制系统的设计

目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是智能教室。 设备的详细功能见网盘中的文章《8、基…

451.根据字符出现频率排序(中等)

451.根据字符出现频率排序(中等) 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转:451.根据字符出现频率排序(中等) 2.详细题解 题目: 347. 前 K 个高频元素(中等&am…

2月科研——arcgis计算植被差异

ArcGIS中&#xff0c;设置高于或低于某个值的像元为 -9999&#xff0c;然后将这些地方设为空——目的&#xff1a;去除异常值和黑色背景值 Con(("T_std ano7.tif" > 2) | ("T_std ano7.tif" < - 2), - 9999,"T_std ano7.tif") SetNull(&…

数学基础【俗说矩阵】:初等矩阵和矩阵的初等行变化关系推导

初等矩阵和矩阵的初等行变换 初等矩阵 矩阵的初等行变换 对单位阵E进行一次初等行变化得到的阵叫做初等阵。 这里只能进行一次初等行变换。 置换阵 给矩阵【左乘】一个【置换阵】&#xff0c;相当与对该矩阵进行了一次【置换阵】对应的【置换】初等行变换&#xff1b; 数…

爬取百度图片,想爬谁就爬谁

前言 既然是做爬虫&#xff0c;那么肯定就会有一些小心思&#xff0c;比如去获取一些自己喜欢的资料等。 去百度图片去抓取图片吧 打开百度图片网站&#xff0c;点击搜索xxx&#xff0c;打开后&#xff0c;滚动滚动条&#xff0c;发现滚动条越来越小&#xff0c;说明图片加载…

Wordpress文章分享到微信朋友圈不带图像问题的解决

目录 一、插件选择 二、插件安装 三、获取微信公众号管理信息 1、登录微信公众平台 2、配置“JS接口安全域名” 3、至安全中心设置“IP白名单” 4、获得“开发者ID(AppID)” 5、获得“开发者密码(AppSecret)” 四、配置插件 五、验证 WordPress装配好后&#xff0c;可…

10.11和10.8那个大(各种ai的回答)

问题&#xff1a;10.11和10.8两个数哪个大 腾讯混元 ✔️ chatGPT ❎ 通义千问 ❎ 文心一言 ✔️ 智谱清言 ❎ 讯飞星火 ✔️ C知道 ❎ 豆包 ✔️

matlab 声音信号希尔伯特黄变换

1、内容简介 略 91-可以交流、咨询、答疑 2、内容说明 略 Hilbert-Huang变换&#xff08;HHT&#xff09;是一种基于经验的数据分析方法 方法。它的扩展基础是自适应的&#xff0c;因此它可以从非线性和非平稳过程中产生具有物理意义的数据表示。这个 适应性的优势是有代价…

代码随想录第二天 | 数组 | 双指针法、滑动窗口、螺旋数组

来源 代码随想录数组第二天 有序数组的平方 数组其实是有序的&#xff0c; 只不过负数平方之后可能成为最大数了。 那么数组平方的最大值就在数组的两端&#xff0c;不是最左边就是最右边&#xff0c;不可能是中间。 此时可以考虑双指针法了&#xff0c;i指向起始位置&…

matlab永磁同步电机反馈试验装置的设计和永磁同步电机仿真

1、内容简介 略 85-可以交流、咨询、答疑 2、内容说明 略 摘要&#xff1a;得益于电力电子器件及控制技术的高速发展&#xff0c;使得电机的应用越来越方便及精确&#xff0c;适应了实际应用对电机性能及质量提出的更高要求和标准。同时电机测试技术也因为电力电子技术的发…

c++ primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作

c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作 c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作 文章目录 c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作16.3.3 对矢量可执行的其他操作…

Idea中git如何进行回退操作

当你的代码已经提交并且推送到远程仓库了如何进行回退 1.首先找到你需要回退到的提交记录 假设你要回退到当前大营销模板位置&#xff0c;右键当前分支然后选中rest 点击后&#xff0c;若需要保留之前提交记录到本地则可以选择max或者soft 选择后进行回退操作&#xff0c;最后将…

全代码 | 随机森林在回归分析中的经典应用

公众号后台记录了发表过文章的各项阅读指标包括&#xff1a;内容标题&#xff0c;总阅读人数&#xff0c;总阅读次数&#xff0c;总分享人数&#xff0c;总分享次数&#xff0c;阅读后关注人数&#xff0c;送达阅读率&#xff0c;分享产生阅读次数&#xff0c;首次分享率&#…

《低代码指南》——Oracle APEX : AI在低代码开发中的创新应用

在低代码开发领域,我们正在目睹人工智能(AI)集成所带来的显著进展。Oracle公司最新推出的APEX 24.1版本,便是这一趋势的明显体现,其集成的AI功能旨在极大提高开发者的生产力,同时简化应用程序的创建过程。 Contents 将变革性的AI整合到低代码平台 将AI技术引入低代码平台…

UniMERNet - 数学公式识别转LaTeX

文章目录 一、关于 UniMERNet演示视频 二、快速入门1、克隆repo并下载模型2、安装3、运行UniMERNet 四、评估1、下载UniMER-Test数据集2、运行评估代码3、与SOTA方法的性能比较&#xff08;BLEU&#xff09;4、不同方法的可视化结果 五、UniMER数据集1、导言2、数据集下载 六、…

【Linux 13】文件系统

文章目录 &#x1f308; 一、前言&#x1f308; 二、文件操作的系统接口⭐ 1. 打开文件 open⭐ 2. 关闭文件 close⭐ 3. 写入文件 write⭐ 4. 读取文件 read &#x1f308; 三、文件描述符⭐ 1. 文件描述符介绍⭐ 2. 提前被分配的文件描述符 0 1 2⭐ 3. 文件描述符的分配规则 &…