我想利用logstash和Csv filter plugin来查看新文件的目录并将其处理到Elasticsearch中。使用类似于此的配置可以轻松实现这一目标:
input {
file {
path => "/csv/*.csv"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
csv {
separator => ","
}
}
output {
elasticsearch {
hosts => "${ELASTICSEARCH_URL}"
index => "myData"
document_type => "auto"
}
}
我主要担心的是弹性和诚信。
弹性 - 我在João Duarte观看了他的演讲,他在一年前解释了这方面的挑战。他解释说,logstash(当时)将所有状态保存在内存中并且不会失败。这仍然是真的吗?他暗示可能将状态存储在文件中,此文件现在是否存在?如果logstash在读取Csv文件的过程中崩溃,我需要它在重新启动时从中断处继续。这可能吗?
诚信 - 经过相当数量的Google搜索后,似乎Logstash is still incapable of deleting (or renaming) the Csv file after it's read。我的数据可能不是幂等的,我不能容忍两次读取相同的Csv。但是,似乎logstash不会继续尝试反复读取同一个文件,因此有一些机制可以防止读取同一个文件(至少立即)。目前建议采取什么策略来做某事"在读取Csv文件(删除,重命名,移动)之后,如果这不可能,那么清理csv文件的最佳做法是什么,因为它们无法永远存在。
答案 0 :(得分:2)
Persistent Queues一直在代码中,而在5.6中它们被认为是生产质量。这会将管道中的事件持久保存到本地文件,该文件将在重新启动时读取。
至于不重读文件,多年来这一直是Logstash的核心部分。其机制称为sincedb
,您指定的文件插件具有sincedb参数来配置它。 sincedb_path
指定将使用的sincedb_file本身,sincedb_write_interval
指定使用文件偏移更新数据库的频率。
为了清理文件,Logstash肯定不提供相应的机制,故意将其留给操作员。有各种各样的机制,其中只有一个是cron作业,每小时运行一次类似下面的内容:
find /var/log/csv-archive/ -atime 0.083 -type f |xargs rm
用于删除一小时内未访问过的所有文件。还有其他方法。