如何强制Logstash重新分析文件?

我安装了Logstash来parsingapache文件。 我花了相当多的时间来设置正确的,我总是尝试真正的日志。 我注意到(正如文档所述)logstash“记住”它在文件中的位置。 现在我的setings是好的,我想Logstash“忘记”。 这似乎比我更难。 我已经做了以下几点:

  • used: start_position => "beginning"

  • 从elastissearch中删除完整的“数据”文件夹(并先停止)

  • lsof -p PID查看哪些文件被logstash打开,并删除了所有有希望的东西(在我的例子中是/tmp/jffi*.tmp

仍Logstash不会忘记和parsing日志文件夹中的“新鲜”文件

有任何想法吗?

默认情况下,logstash将位置最后一次写入通常驻留在$HOME/.sincedb的日志文件中。 Logstash可以被愚弄为相信它从未通过将/dev/null指定为sincedb_path来parsing日志文件。

这里是文档input文件的一部分。

自写数据库的位置(跟踪受监控日志文件的当前位置)。 缺省为环境variables“$ SINCEDB_PATH”或“$ HOME / .sincedb”的值。

configuration示例

 input { file { path => "/tmp/logfile_to_analyse" start_position => "beginning" sincedb_path => "/dev/null" } } 

在sincedb文件中的插件文件存储“tailing”的历史,默认:在$ HOME / .sincedb *之下,参见http://logstash.net/docs/1.3.3/inputs/file#sincedb_path

因为db文件包含行如下所示:

 [inode] [major device number] [minor device number] [byte offset] 

所以,如果你想再parsing一个完整的文件,你需要:

  • 删除sindedb文件
  • 或者只删除sincedb文件中的相应行,检查文件之前的inode号( ls -i yourFile | awk '{print $1}'
  • 并重新启动Logstash

使用关键start_position =>“开始,Logstash将分析所有文件。

一个sincedb文件的例子:

  • 名称:.sincedb_7a7413a84171aa550d5318c17fd756e9:该名称包含关键path( http://logstash.net/docs/1.3.3/inputs/file#path )中所有目录的sincedb_和MD5(Digest :: MD5.hexdigest)。 查看插件的代码文件: https : //github.com/logstash/logstash/blob/master/lib/logstash/inputs/file.rb#L105

Logstash将logging在$ HOME / .sincedb_ *中。 您可以删除所有.sincedb并重新启动logstash,Logstash将重新分析该文件。

综合所有答案,猜测这是parsing文件的最好方法。 我做了同样的testing。

 input { file { path => "/tmp/access_log" start_position => beginning sincedb_path => "/dev/null" ignore_older => 0 } } 

要进行快速testing,您也可以touch /tmp/access_log来更改文件的时间戳,而不是ignore_older

如果你正在使用logstash-forwarder,请检查你的家.logstash-forwarder文件:

 { "/var/log/messages": { "source": "/var/log/messages", "offset": 43715, "inode": 12967, "device": 51776 } } 

删除$ HOME / .sincedb_ *后,仍然没有为我摄入数据。

在尝试了一堆东西之后,我从/etc/logstash/conf.d中删除了所有主要的.conf文件,并重新启动了logstash,一切正常。 我只能假定logstash默默地挂在.conf文件中的某个东西上。

如果文件中有大量的数据,实际上每次重新计算都是非常昂贵的。 所以你在做这个之前要小心。 如果我们想强制它重新parsing,那么在input块内设置参数

 sincedb_path => "/dev/null" 

该选项不会存储.sincedb文件,每次都会重新parsinglogstash。 但是,如果你偶尔要重新进行重新分析,那么你可以做的是手动删除parsing文件时创build的.sinceDbpath。 一般来说,如果你不是根目录下的root用户,它将作为隐藏文件存在于主目录中。 您还可以将sincedb_path设置为其他位置来轻松地跟踪此文件。

 sincedb_path => "/home/shubham/sinceDB/productsSince.db" 

我发现它在我的家庭目录,但删除后,logstash拒绝重新挑选现有的日志文件。 我得到它的工作方式是补充

 sincedb_path => "/opt/elk/sincedb/" 

到我的文件插件。 我想重置每一次,只是改变sincedb_path的path

如果你想避免混淆logstash选项,我发现重命名或删除现有的日志文件,并从旧的文件内容创build一个新的文件将欺骗logstash重新索引。

logstash版本5的新目录在

/插件/input/文件

path.data定义在logstash.yml中