ELK应用之Filebeat

ELK应用之Filebeat,第1张

Filebeat是本地文件日志数据采集器,可监控日志目录或特定日志文件(tail file),并将它们转发给Elasticsearch或Logstatsh进行索引、kafka等。带有内部模块(auditd,Apache,Nginx,System和MySQL),可通过一个指定命令来简化通用日志格式的收集,解析和可视化。

官方网址: https://wwwelasticco/guide/en/beats/filebeat/current/indexhtml

Filebeat涉及两个组件:查找器prospector和采集器harvester,来读取文件(tail file)并将事件数据发送到指定的输出。

启动Filebeat时,它会启动一个或多个查找器,查看你为日志文件指定的本地路径。对于prospector所在的每个日志文件,prospector启动harvester。每个harvester都会为新内容读取单个日志文件,并将新日志数据发送到libbeat,后者将聚合事件并将聚合数据发送到你为Filebeat配置的输出。

当发送数据到Logstash或Elasticsearch时,Filebeat使用一个反压力敏感(backpressure-sensitive)的协议来解释高负荷的数据量。当Logstash数据处理繁忙时,Filebeat放慢它的读取速度。一旦压力解除,Filebeat将恢复到原来的速度,继续传输数据。

Harvester负责读取单个文件的内容。读取每个文件,并将内容发送到the output,每个文件启动一个harvester, harvester负责打开和关闭文件,这意味着在运行时文件描述符保持打开状态。

如果文件在读取时被删除或重命名,Filebeat将继续读取文件。这有副作用,即在harvester关闭之前,磁盘上的空间被保留。默认情况下,Filebeat将文件保持打开状态,直到达到close_inactive状态

关闭harvester会产生以下结果:

1)如果在harvester仍在读取文件时文件被删除,则关闭文件句柄,释放底层资源。

2)文件的采集只会在scan_frequency过后重新开始。

3)如果在harvester关闭的情况下移动或移除文件,则不会继续处理文件。

要控制收割机何时关闭,请使用close_ 配置选项

Prospector负责管理harvester并找到所有要读取的文件来源。如果输入类型为日志,则查找器将查找路径匹配的所有文件,并为每个文件启动一个harvester。每个prospector都在自己的Go协程中运行。

Filebeat目前支持两种prospector类型:log和stdin。每个prospector类型可以定义多次。日志prospector检查每个文件来查看harvester是否需要启动,是否已经运行,或者该文件是否可以被忽略(请参阅ignore_older)。

只有在harvester关闭后文件的大小发生了变化,才会读取到新行。

注:Filebeat prospector只能读取本地文件,没有功能可以连接到远程主机来读取存储的文件或日志。

配置文件:$FILEBEAT_HOME/filebeatyml。Filebeat可以一次读取某个文件夹下的所有后缀名为log的文件,也可以读取指定的某一个后缀名为log的文件。

配置文件详解( http://blog51ctocom/michaelkang/1864225 )

(1)字段解释

paths: 指定要监控的日志,目前按照Go语言的glob函数处理。没有对配置目录做递归处理,比如配置的如果是:

/var/log/ /log

则只会去/var/log目录的所有子目录中寻找以"log"结尾的文件,而不会寻找/var/log目录下以"log"结尾的文件。

encoding: 指定被监控的文件的编码类型,使用plain和utf-8都是可以处理中文日志的。

input_type: 指定文件的输入类型log(默认)或者stdin。

exclude_lines: 在输入中排除符合正则表达式列表的那些行。

include_lines: 包含输入中符合正则表达式列表的那些行(默认包含所有行),include_lines执行完毕之后会执行exclude_lines。

exclude_files: 忽略掉符合正则表达式列表的文件(默认为每一个符合paths定义的文件都创建一个harvester)。

fields: 向输出的每一条日志添加额外的信息,比如"level:debug",方便后续对日志进行分组统计。默认情况下,会在输出信息的fields子目录下以指定的新增fields建立子目录,

fields_under_root: 如果该选项设置为true,则新增fields成为顶级目录,而不是将其放在fields目录下。自定义的field会覆盖filebeat默认的field。

ignore_older: 可以指定Filebeat忽略指定时间段以外修改的日志内容,比如2h(两个小时)或者5m(5分钟)。

close_older: 如果一个文件在某个时间段内没有发生过更新,则关闭监控的文件handle。默认1h。

force_close_files: Filebeat会在没有到达close_older之前一直保持文件的handle,如果在这个时间窗内删除文件会有问题,所以可以把force_close_files设置为true,只要filebeat检测到文件名字发生变化,就会关掉这个handle。

scan_frequency: Filebeat以多快的频率去prospector指定的目录下面检测文件更新(比如是否有新增文件),如果设置为0s,则Filebeat会尽可能快地感知更新(占用的CPU会变高)。默认是10s。

document_type: 设定Elasticsearch输出时的document的type字段,也可以用来给日志进行分类。

harvester_buffer_size: 每个harvester监控文件时,使用的buffer的大小。

max_bytes: 日志文件中增加一行算一个日志事件,max_bytes限制在一次日志事件中最多上传的字节数,多出的字节会被丢弃。默认是10MB。

multiline: 适用于日志中每一条日志占据多行的情况,比如各种语言的报错信息调用栈。这个配置的下面包含如下配置:

pattern: 多行日志开始的那一行匹配的pattern

negate: 是否需要对pattern条件转置使用,不翻转设为true,反转设置为false。

match: 匹配pattern后,与前面(before)还是后面(after)的内容合并为一条日志

max_lines: 合并的最多行数(包含匹配pattern的那一行),默认为500行。

timeout: 到了timeout之后,即使没有匹配一个新的pattern(发生一个新的事件),也把已经匹配的日志事件发送出去

tail_files: 如果设置为true,Filebeat从文件尾开始监控文件新增内容,把新增的每一行文件作为一个事件依次发送,而不是从文件开始处重新发送所有内容。

backoff: Filebeat检测到某个文件到了EOF之后,每次等待多久再去检测文件是否有更新,默认为1s。

max_backoff: Filebeat检测到某个文件到了EOF之后,等待检测文件更新的最大时间,默认是10秒。

backoff_factor: 定义到达max_backoff的速度,默认因子是2,到达max_backoff后,变成每次等待max_backoff那么长的时间才backoff一次,直到文件有更新才会重置为backoff。比如: 

如果设置成1,意味着去使能了退避算法,每隔backoff那么长的时间退避一次。

spool_size: spooler的大小,spooler中的事件数量超过这个阈值的时候会清空发送出去(不论是否到达超时时间),默认1MB。

idle_timeout: spooler的超时时间,如果到了超时时间,spooler也会清空发送出去(不论是否到达容量的阈值),默认1s。

registry_file: 记录filebeat处理日志文件的位置的文件

config_dir: 如果要在本配置文件中引入其他位置的配置文件,可以写在这里(需要写完整路径),但是只处理prospector的部分。

publish_async: 是否采用异步发送模式(实验功能)。

具体的一个yml采集配置样例如下:该配置文件是filebeat采集数据的依据,并根据需求添加必要配置,filebeat收集日志后发往logstash,配置如下:

cd FILEBEAT_HOME

 nohup /bin/filebeat -f config/testconf >>/FILEBEAT_HOME/logs/filebeatlog &

后台启动filebeat,配置对应的参数

启动多个filebeat配置,新建一个目录(conf)存放多个filebeat的配置文件,

#nohup /bin/filebeat -f conf/ >>/FILEBEAT_HOME/logs/filebeatlog &

 注意:一台服务器只能启动一个filebeat进程。

ps -ef |grep filebeat

kill -9 $pid

注意: 非紧急情况下,杀掉进程只能用优雅方式。

A、filebeat运行不成功

问题:配置文件格式有问题,配置文件遵循yml文件格式, 多或少一个空格 都会导致启动问题,可以使用cmd命令窗口到filebeat安装路径下,使用filebeatexe –c filebeatyml 查看报错,也可以看filebeat路径下的log文件夹中的filebeat文件

B、 filebeat第一次运行成功无数据

问题:a、路径有问题

b、运行条件设置有问题(例如只采集某个条件下的数据,文件中没有符合条件的数据,这种情况下先注释掉采集条件测试一下)

C、filebeat运行成功第一次运行后有数据,第二次无数据

问题:filebeat读取文件后会生成一个registry文件,注意windows机器中这个文件在手动启动的情况下会在filebeat安装目录下的data文件夹中,服务注册启动的情况下会在C盘下隐藏文件夹C:\ProgramData\filebeat中,删除掉这个就可以了

D、filebeat运行成功有数据,但是新添加数据不读取问题

问题:filebeat传输存在反压机制,在数据量特别大或者传输通道不通的情况下,filebeat会进行反压,暂停发送,等到数据量稳定或者数据传输通道正常的之后才会发送

Filebeat 保存每个文件的状态并经常将状态刷新到磁盘上的注册文件中。该状态用于记住harvester正在读取的最后偏移量,并确保发送所有日志行。如果输出(例如Elasticsearch或Logstash)无法访问,Filebeat会跟踪最后发送的行,并在输出再次可用时继续读取文件。

在Filebeat运行时,每个prospector内存中也会保存文件状态信息,当重新启动Filebeat时,将使用注册文件的数据来重建文件状态,Filebeat将每个harvester在从保存的最后偏移量继续读取。

每个prospector为它找到的每个文件保留一个状态。由于文件可以被重命名或移动,因此文件名和路径不足以识别文件。对于每个文件,Filebeat存储唯一标识符以检测文件是否先前已被采集过。

如果你使用的案例涉及每天创建大量新文件,你可能会发现注册文件增长过大。请参阅注册表文件太大?编辑有关你可以设置以解决此问题的配置选项的详细信息。

Filebeat保证事件至少会被传送到配置的输出一次,并且不会丢失数据。 Filebeat能够实现此行为,因为它将每个事件的传递状态存储在注册文件中。

在输出阻塞或未确认所有事件的情况下,Filebeat将继续尝试发送事件,直到接收端确认已收到。如果Filebeat在发送事件的过程中关闭,它不会等待输出确认所有收到事件。

发送到输出但在Filebeat关闭前未确认的任何事件在重新启动Filebeat时会再次发送。这可以确保每个事件至少发送一次,但最终会将重复事件发送到输出。

也可以通过设置shutdown_timeout选项来配置Filebeat以在关闭之前等待特定时间。

注意:Filebeat的至少一次交付保证包括日志轮换和删除旧文件的限制。如果将日志文件写入磁盘并且写入速度超过Filebeat可以处理的速度,或者在输出不可用时删除了文件,则可能会丢失数据。

在Linux上,Filebeat也可能因inode重用而跳过行。有关inode重用问题的更多详细信息,请参阅filebeat常见问题解答。

Logback日志切割用的是JDK里File#renameTo()方法。如果该方法失败,就再尝试使用复制数据的方式切割日志。查找该方法相关资料得知,只有当源文件和目标目录处于同一个文件系统、同volumn(即windows下的C, D盘)下该方法才会成功,切不会为重命名的后的文件分配新的inode值。也就是说,如果程序里一直保存着该文件的描述符,那么当程序再写日志时,就会向重命名后的文件中写。那么问题来了,filebeat是会一直打开并保存文件描述符的,那么它是怎么得知日志被切割这件事的呢?

如果只用当前文件描述符一路监控到天黑的话,那么当logback把日志重命名后,filebeat仍然会监控重命名后的日志,新创建的日志文件就看不到了。实际上,filebeat是通过close_inactive和scan_frequency两个参数(机制)来应对这种情况的:

(1)close_inactive

该参数指定当被监控的文件多长时间没有变化后就关闭文件句柄(file handle)。官方建议将这个参数设置为一个比文件最大更新间隔大的值。比如文件最长5s更新一次,那就设置成1min。默认值为5min。

(2)scan_frequency

该参数指定Filebeat搜索新文件的频率(时间间隔)。当发现新的文件被创建时, Filebeat会为它再启动一个 harvester 进行监控,默认为10s。

综合以上两个机制,当logback完成日志切割后(即重命名),此时老的harvester仍然在监控重命名后的日志文件,但是由于该文件不会再更新,因此会在close_inactive时间后关闭这个文件的 harvester。当scan_frequency时间过后,Filebeat会发现目录中出现了新文件,于是为该文件启动 harvester 进行监控。这样就保证了切割日志时也能不丢不重的传输数据。(不重是通过为每个日志文件保存offset实现的)

当elk是复数时为什么没有s

鹿科动物 (deer、elk) 以及羊 (sheep) 和鱼类 (fish) 都属于单复数同形,如果用 elks 则表示不同种类的 “麋鹿”。

sheep为什么没有复数

sheep 是可数名词,有复数呀,它的复数与单数相同

都是sheep

a sheep

o sheep

many sheep

people为什么没有复数?

people是可数名词,有复数,但复数与单数写法相同。如果是说一个人就是one people,后面的谓语动词要用第三人称单数形式,如果是两人或多个人,后面的谓语动词要用复数形式。

beijing opera 为什么没有复数

没有为什么,面包不也是不可数名词吗?

where will the game be ?的be是什么意思当wowan为复数时为什么后面的名词也要为复数

这是一个倒装句,这个句子还原:the game will be where?意思是这个游戏将在哪里?所以这里be是是的意思,作动词

action为什么意思时为复数,什么时候,为单数?

对于你所说的来说,“行为”不可数,“行动”可数,而当action作为“举止、行为、品行”的时候,其一般的状态就是复数的,希望我的答案能对你有所帮助。

为什么roof 变为复数时加S?

因为“f”前面的字母是双写的母音“o”(注意是双写的母音)

这种情况就是直接加“s”

为什么hold in hand中hand没有复数

有些约定俗成的片语用法就是那样的

mood复数是加S吗为什么

tomato、hero、potato后加-es

radio、piano等词后加-s。

其实,以o结尾的英语单词,表示“有生命”的事物,则加-es,无生命的,则加s。这样,以后如碰到这类可数名词。其复数形式也就把握了。甚至在以后,学到像volcano(火山)、tobao(菸草)这些词,其复数形式加-s或-es均可,这一点就不难理解了。

giraffe变复数时为什么不把fe变成v

gifaffe的复数是: giraffes或 giraffe 肯定地讲,任何语言(除世界语)都是先有语言,语法则是后来的人们总结、规纳了语言中有规律的东西,形成的语法。而总是有一些特殊的语言现象,它无法纳入语法中,这就形成了语言中的特殊规则。显然,giraffe的复数形式就是属于这种情况。另外,动词的过去时,不是也有许多特殊的情况吗?等等。 这就是答案,希望你能理解。

21 日志的采集灵活性是我们选择日志采集方案更看重的因素,所以logstash属于首先方案, 它可以兼顾多种不同系统和应用类型等因素的差异,从源头上进行一些初步的日志预处理。logstash唯一的小缺憾是它的不轻便, 因为它是使用jruby开发并跑在java虚拟机上的agent, 当然啦,同时也是优点,即各种平台上都可以用。22 日志的汇总与过滤kafka在我们挖财已经属于核心的中间件服务, 所以, 日志的汇总自然而然会倾向于使用kafka。日志的过滤和处理因为需求的多样性,可以直接对接订阅kafka, 然后根据各自的需求进行日志的定制处理, 比如过滤和监控应用日志的异常,即使通过zabbix进行预警; 或者数据仓库方面在原始日志的基础上进行清洗和转换,然后加载到新的数据源中;23 日志的存储原始的日志存储我们采用ElasticSearch, 即ELK技术栈中E的原本用途,遵循ELK技术栈中各个方案之间的通用规范, 比如日志如索引采用logstash与kibana之间约定的index pattern。日志的衍生数据则日志使用各方根据需求自行选择。24 日志的分析与查询ELK技术栈中的Kibana已经可以很好的满足这一需求,这里我们不折腾。3 需要解决哪些技术问题?因为我们在ELK技术栈的处理链路上插入了一些扩展点,所以,有些问题需要解决和澄清31 logstash与kafka的对接ELK技术栈中, Logstash和Elastic Search是通过logstash的elasticsearch或者elasticsearch_http这几个output直接对接的, 为了让logstash转而对接kafka,我们有几种选择:logstash-kafkalogstash-output-kafkalogstash的httpoutput第一种和第二种方案都需要编译打包相应的依赖到logstash,然后随同logstash一起部署到服务结点, 虽然可以work, 但依赖重, 资源消耗多, 通用性不强;个人更倾向于第三种方案,即使用logstash默认提供的http这个output, 因为http比较通用, 而且本身我们的kafka前面就有为了多系统对接而提供的http proxy方案部署。另外,依赖的管理和升级都在服务端维护,对每个服务结点是透明的。 当然, 唯一的弱点是效率可能不如基于长连接的消息传递高,只是暂时不是问题,即使将来成为瓶颈,也可以通过sharding的形式进行扩展。32 kafka到elastic search的数据链路对接kafka和es之间我们要加入一套日志过滤与处理系统, 这套系统是我们发挥整个体系最大威力的地方。 在整个系统的处理pipeline中,我们可以根据需求添加任意需要的Filter/Processor, 比如服务于应用报警的Filter/Processor,服务于数据仓库ETL的Filter/Processor等等。 但不管前面做了多少事情, 日志最终是要接入到ES进行存储的。因为ELK技术栈中三者的对接遵循一些规范或者说规则, 而我们又需要继续复用这个技术栈中的服务提供的特定功能, 所以,即使是我们在整个处理链路中插入了扩展点,但数据的存储依然需要遵循ELK原来的规范和规则, 以便Kibana可以从ES中捞日志出来分析和展示的时候不需要任何改动。logstash存入ES的日志,一般遵循如下的index pattern:logstash-%{+YYYYMMdd}使用日期进行索引(index)界定的好处是, 可以按照日期范围定期进行清理。NOTE进一步深入说明一下, 针对不同的日志类别, index pattern也最好分类对应。更多信息:Each log line from the input file is associated with a logstash event Each logstash event has fields associated with it By default, "message", "@timestamp", "@version", "host", "path" are created The "message" field, referenced in the conditional statement, contains all the original text of the log line日志处理系统可以使用ES的java客户端或者直接通过ES的HTTP服务进行采集到的日志索引操作。

欢迎分享,转载请注明来源:浪漫分享网

原文地址:https://hunlipic.com/meirong/11309640.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-11-27
下一篇2023-11-27

发表评论

登录后才能评论

评论列表(0条)

    保存