Logstash关闭文件描述符?

时间:2015-06-02 10:43:57

标签: elasticsearch logstash logstash-grok logstash-file

背景:

我们rsyslog创建日志文件目录,如:/var/log/rsyslog/SERVER-NAME/LOG-DATE/LOG-FILE-NAME 因此,多个服务器将不同日期的日志分发到中心位置。

现在阅读这些日志并将它们存储在elasticsearch中进行分析我的logstash配置文件是这样的:

file{
   path => /var/log/rsyslog/**/*.log
}

问题:

现在,当目录中的日志文件数量增加时,logstash会打开新文件的文件描述符(FD),并且不会为已读取的日志文件释放FD。 由于日志文件是按日期生成的,因此一旦读取它,之后就没有用了,因为在该日期之后它不会被更新。

我已在/etc/security/limits.conf

中将文件空缺限制增加到65K

我们可以让logstash在一段时间后关闭句柄,这样打开的文件句柄数量不会增加太多吗?

2 个答案:

答案 0 :(得分:6)

我想你可能已经遇到过这个错误:http://github.com/elastic/logstash/issues/1604。你有相同的症状吗?一段时间后日志中的异常?如果你运行sudo lsof | grep java | wc -l,你会看到描述符随着时间的推移而稳步增长吗? (其中一些可能会关闭,但有些会保持开放状态,而且数量会增加)

答案 1 :(得分:1)

我已经跟踪了这个问题已有一段时间了,我也不知道它已经得到了妥善的解决。

我们在类似的船上,也许更大:Logstash无法打开盒子上数十万个日志文件的句柄,即使它们中很少有人积极地写入。 LOGSTASH-271抓住了这个问题,并尝试修补Logstash,包括PR #1260

似乎修复可能已经使用PR #1545进入Logstash 1.5,但我从未亲自测试过。我们最终要求底层库使用Logstash用来实现名为FileWatch的文件输入到FFileWatch,这会添加"eviction mechanism"

这种方法背后的基本思想是只在文件被打开时保持打开状态。通常,Logstash将打开文件的句柄并使其永久打开,但如果文件最近没有更改(eviction_interval),FFileWatch会添加一个关闭句柄的选项。然后我使用forked gem创建了一个Logstash的自定义构建。

显然这不太理想,但它对我们有用。最终我们完全删除了Logstash以获取日志文件,尽管我们仍然在日志处理管道中进一步使用它。我们实现了自己的轻量级日志托运器(Franz),它没有遇到这个问题。