在使用filebeat监控日志文件时,如果不会做任何配置的话你可能会发现一些奇怪的问题,即有时新的日志行会马上发送到目标输出地,有时候却要延迟近10s才会被发送。要解决这个问题,首先要明确filebeat中几个组件的作用和几个重要的参数的含意,如下:
- Input组件
input
组件负责监控日志文件(目录)自身的变化情况,如某文件被移动、删除了或创建了新文件,然后将这些信息提供给Harvester
使用。 - Harvester组件
Harvester
用于监控一个日志文件内容的变化情况。如,是否新加了一行数据,是否读到了EOF等。 - Spooler组件
Spooler
用于将Harvester
"收割"到的新事件(日志行)发送到指定目的地,如ES, Kafka, Logstash, File等。
明确了这几个核心组件的功能后就不难理解日志为什么会延迟,首先Input
会以一定间隔扫描日志文件的变化情况,如果在间隔之间删除、创建了文件,那就不会被探测到; 其次Harvester
在检测日志文件内容时也会有一定频率,而且如果读到EOF还会触发新的策略; 最后Spooler
对于需要发送的事件也有一个缓存,如果设置不当可能会导致Spooler积攒一堆事件后才发送从而进一步加重日志延迟。
下面看一下影响日志实时性的几个核心参数:
- scan_frequency
这个参数用于控制Input
多久扫描一次日志文件的变更情况,默认值为10s
。也就是说,如果此时你的日志框架对文件进行了分割,那么最多需要等待10s
filebeat才会发现被分割出来的新文件,然后启动新Harvester
来监控新文件的内容变化情况。这个参数可以不做调整,因为日志分割是一个低频操作,而且一般都是在零点发生,这时候对日志的实时性没有这么高的要