BACKGROUND:
我们有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在一段时间后关闭句柄,这样打开的文件句柄数量不会增加太多吗?
我想你可能碰到了这个bug: http://github.com/elastic/logstash/issues/1604。你有同样的症状吗?一段时间后日志异常?如果运行sudo lsof | grep java | wc -l
,您是否看到描述符随着时间稳步增长?(其中一些可能会关闭,但有些会保持开放,并且它们的数量会增加)
我已经跟踪这个问题一段时间了,但我不知道它是否得到了妥善解决。
我们也在类似的船上,也许更大:Logstash无法打开一个盒子上数十万个日志文件的句柄,即使其中很少有人被主动写入。Logstash -271捕获了这个问题,并且有一些修补Logstash的尝试,包括pr# 1260。
这似乎是一个修复可能已经使它的方式到Logstash 1.5与PR #1545,但我从来没有测试过这个个人。我们最终将Logstash用于实现文件输入的底层库(称为FileWatch)分支到FFileWatch中,它添加了一个"驱逐机制"。
这种方法背后的基本思想是只在文件被写入时保持打开状态。通常,Logstash会在文件上打开一个句柄并使其永远打开,但是FFileWatch添加了一个选项,如果文件最近没有更改(eviction_interval
),则关闭该句柄。然后,我使用fork gem创建了Logstash的自定义构建。
显然这是不理想的,但它为我们工作。最终,我们完全放弃了Logstash来获取日志文件,尽管我们仍然在日志处理管道中使用它。我们实现了自己的轻量级日志发送器(Franz),它不存在这个问题。