之前阿里的 tailfile 有许多坑,包括对软连接支持度不够,可能会有意想不到的后果,不保证采集数据完整性。比如有某些 情况下(Checkpoint 文件损毁) 重启采集进程后会重复读取历史已采集数据打爆服务器 Load。所以,要更好地使用 Filebeat,我们需要了解 Filebeat 哪些事儿我搞不定
,哪些事儿我无法承诺
。官方文档是一个非常好的参考:Frequently Asked Questions。
无法从网络 Volumes 读取 Log
不建议使用 Filebeat 从网络 Volumes 读取日志文件。 尽可能在主机上安装 Filebeat 并从那里直接发送日志文件。 从网络Volumes 读取文件(尤其是在Windows上)可能会产生意外的副作用。 例如,更改的文件标识符可能导致 Filebeat 再次从头读取日志文件。
Filebeat 无法采集数据
这可能是因为 Filebeat 配置不正确或无法将事件发送到 output,解决方案:
- 确保配置文件指定正在收集的文件的正确路径。 有关详细信息,请参阅 Step 2: Configuring Filebeat。
- 验证文件是否早于
ignore_older
指定的值。ignore_older
默认是禁用的,这取决于设置的值。 我们可以通过为ignore_older
指定不同的值来更改此行为。 - 确保 Filebeat 能够将事件发送到已配置的 output。 在调试模式下运行 Filebeat 以确定它是否成功发布事件:
./filebeat -c config.yml -e -d "*"
下面说说 ignore_older
这个配置:
如果启用此选项,Filebeat 将忽略在指定时间跨度之前修改的任何文件。 如果我们将日志文件保留很长时间,那么配置ignore_older
尤其有用。 例如,如果要启动 Filebeat
,但只想发送最新文件和自上周以来的文件,则可以配置此选项。我们可以使用时间字符串,如 2h(2小时)和 5m(5分钟)。 默认值为0
,禁用该设置。 注释掉配置与将其设置为0具有相同的效果。
注意:我们必须设置 ignore_older > close_inactive。
配置项 close_inactive
表示在 harvester
读取某文件最后一行日志之后,持续时间内某文件没有再写入日志,Filebeat 将关闭文件句柄,默认是 5m。
发生 Too many open files
Filebeat 会持续保持着句柄,以便以便它可以近乎实时地读取新的日志行。如果 Filebeat 正在收集大量文件,则打开的文件数可能会成为问题。在大多数环境中,活动更新的文件数较少。应相应设置 close_inactive
配置选项以关闭不再活动的文件。
还有其他配置选项可以用来关闭文件处理程序,但是所有这些配置选项都应该仔细使用,因为它们可能有副作用。选项是:
close_renamed
close_removed
close_eof
close_timeout
harvester_limit
close_renamed
和 close_removed
选项在 Windows 上可用于解决与 log rotate 相关的问题。请参阅 the section called “Open file handlers cause issues with Windows file rotation?。 close_eof
选项在包含大量文件且只有很少 entries 的环境中很有用。close_timeout
选项在允许数据丢失且必须对文件句柄关闭非常重视的情况下非常有用。有关更多详细信息,请参阅 Filebeat Prospectors Configuration。
在使用任何配置选项之前,请确保阅读了这些配置选项的文档。
Registry file 过大
Filebeat保持每个文件的状态,并将状态保持在 registry_file 中。 Filebeat 重新启动时,文件状态用于继续在先前位置读取文件。 如果每天生成大量的新文件,则 文registry_file 件可能会增长得太大。 要减小 registry_file 的大小,有两个可用的配置选项:clean_removed
和 clean_inactive
。
对于不再 touch 并需要 ignore 的旧文件,建议使用 clean_inactive
。 对于已经从磁盘删除的旧文件,则使用 clean_removed
选项。
Inode 复用造成数据采集缺失
在 Linux 文件系统上,Filebeat 使用 inode 和 device 来标识文件。当文件从磁盘中删除时,可以将 inode 分配给一个新文件。在涉及文件轮换的用例中,如果旧文件被删除,并且之后立即创建新文件,则新文件可以具有与被移除的文件完全相同的 inode。在这种情况下,Filebeat 假定新文件与旧文件相同,并尝试在旧 offset 继续读取,这是不正确的。
默认情况下,永远不会从 registry_file 中删除。要解决 inode 复用问题,建议使用 clean_ *
选项,特别是 clean_inactive
,以删除非活动文件的状态。例如,如果文件每 24 小时轮换一次,并且轮转的文件不再更新,可以将ignore_older
设置为48小时,将 clean_inactive
设置为72小时。
对于从磁盘中删除的文件,可以使用 clean_removed
。请注意,每当在扫描期间找不到文件时,clean_removed
会从 registry_file 清除文件状态。如果文件稍后再次显示,则将从头重新发送。
Filebeat 使用了过多 CPU
Filebeat 可能被配置为太频繁地扫描文件。 检查 filebeat.yml
配置文件中 scan_frequency
的设置。 将scan_frequency
设置为小于1秒可能导致 Filebeat 扫描磁盘过于频繁。
字段在 Kibana 可视化中不可被索引
如果最近执行了 loads 或解析自定义结构化日志的操作,则可能需要刷新索引以使字段在 Kibana 中可用。 要刷新索引,请使用刷新API。 例如:
curl -XPOST 'http://localhost:9200/filebeat-2016.08.09/_refresh'
Filebeat 总是不发送文件的最后一行
Filebeat 使用换行符来检测事件的结束。 如果行被递增地添加到正在收集的文件,则最后一行之后需要换行符,否则Filebeat 将不会读取文件的最后一行。
如何对 Filebeat 限带宽
如果需要限制带宽使用,建议在操作系统上配置网络堆栈以执行带宽限制。
例如,以下 Linux 命令通过在端口 5044 上对 TCP 连接设置 50 kbps 的限制来限制 Filebeat 和 Logstash 之间的连接:
tc qdisc add dev $DEV root handle 1: htb
tc class add dev $DEV parent 1:1 classid 1:10 htb rate 50kbps ceil 50kbps
tc filter add dev $DEV parent 1:0 prio 1 protocol ip handle 10 fw flowid 1:10
iptables -A OUTPUT -t mangle -p tcp --dport 5044 -j MARK --set-mark 10
使用OS工具执行带宽限制可以更好地控制策略。 例如,可以使用操作系统工具在白天限制带宽,但不能在夜间限制。 或者,可以保留带宽未封顶,但为流量分配低优先级。
常见的 SSL 相关错误和解决方案
以下是一些常见的错误和解决方法:
x509: cannot validate certificate for <IP address> because it doesn’t contain any IP SANs
这是因为证书仅对 Subject filed 中显示的 hostname 有效。要解决此问题,请尝试以下解决方案:
- 为主机名创建一个DNS条目,将其映射到服务器的IP。
- 在
/etc/hosts
中为主机名创建一个条目。或在 Windows 上添加一个条目到C:\Windows\System32\drivers\etc\hosts
。 - 重新创建服务器证书,并为服务器的IP地址添加 SubjectAltName(SAN)。这使服务器的证书对主机名和IP地址都有效。
getsockopt: no route to host
这不是SSL问题。这是一个网络问题。确保两个主机可以通信。
getsockopt:connection refused
这不是SSL问题。确保 Logstash 正在运行,并且没有防火墙阻止流量。
No connection could be made because the target machine actively refused it
防火墙拒绝连接。检查防火墙是否阻止客户端,网络或目标主机上的流量。
网友评论
有设置的方法吗?