13

背景:

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

现在要读取这些日志并将它们存储在 elasticsearch 中以进行分析,我的 logstash 配置文件如下所示:

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

问题 :

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

我已将文件打开限制增加到 65K/etc/security/limits.conf

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

4

2 回答 2

6

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

于 2015-06-10T20:56:24.267 回答
1

我一直在跟踪这个问题一段时间,我不知道它是否得到妥善解决。

我们在一条类似的船上,也许更大:Logstash 无法打开一个盒子上数十万个日志文件的句柄,即使其中很少有主动写入。LOGSTASH-271捕获了这个问题,并且有一些尝试修补 Logstash,包括PR #1260

似乎一个修复程序可能已经通过PR #1545进入 Logstash 1.5 ,但我从未亲自测试过。我们最终将 Logstash 用于实现文件输入的底层库(称为 FileWatch)分叉到FFileWatch中,这增加了“驱逐机制”

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

显然这不太理想,但它对我们有用。最终我们完全放弃了 Logstash 来获取日志文件,尽管我们仍然在日志处理管道的下游使用它。我们实现了我们自己的轻量级日志托运器(Franz),它不会受到这个问题的影响。

于 2015-06-11T23:52:15.410 回答