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

时间:2013-10-23 16:11:50

标签: file logstash

我安装了Logstash来解析apache文件。我花了很多时间来设置正确的,我总是尝试真正的日志。我注意到(正如文档所说)logstash“记住”它在文件中的位置。现在我的设置很好,我希望Logstash“忘记”。这似乎比我更难。我已经做了以下事情:

  • 使用:start_position => "beginning"

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

  • 查看了使用lsof -p PID的logstash打开的文件,并删除了所有有希望的内容(在我的情况下为/tmp/jffi*.tmp

仍然Logstash不会忘记并解析日志所在文件夹中的“新鲜”文件

有什么想法吗?

13 个答案:

答案 0 :(得分:127)

默认情况下,logstash将最后一个位置写入日志文件,该日志文件通常位于$HOME/.sincedb中。通过将/dev/null指定为sincedb_path,Logstash可能会误以为它从未解析过日志文件。

这是文档Input File的一部分。

  

从哪里写入自己的数据库(跟踪当前位置   受监视的日志文件)。默认为环境变量的值   " $ SINCEDB_PATH"或" $ HOME / .sincedb"。

配置示例

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

答案 1 :(得分:18)

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

自db文件以来包含如下行:

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

因此,如果要再次解析完整文件,则需要:

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

使用密钥start_position => "beginning",Logstash将分析所有文件。

sincedb文件的示例:

答案 2 :(得分:9)

Logstash会将记录保存在$HOME/.sincedb_*中。您可以删除所有.sincedb并重新启动logstash,Logstash将重新解析该文件。

答案 3 :(得分:9)

结合所有答案,猜猜这是解析文件的最佳方法。我的测试也做了同样的事情。

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

要进行快速测试,您还可以ignore_older代替touch /tmp/access_log来更改文件的时间戳。

答案 4 :(得分:5)

如果您使用的是logstash-forwarder,请检查您家的.logstash-forwarder文件:

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

答案 5 :(得分:3)

删除$HOME/.sincedb_*后,它仍然没有为我提取数据。

在尝试了很多事情之后,我从.conf删除了除/etc/logstash/conf.d主文件以外的所有文件,然后重新启动了Logstash,一切正常。我只能假设其中一个.conf文件中存在logstash默默挂起的内容。

答案 6 :(得分:1)

如果文件中包含大量数据,实际上每次重新分析都会非常昂贵。所以在这之前你需要小心。 如果我们想强制它再次重新分析,那么在输入块

中设置参数
sincedb_path => "/dev/null" 

此选项不会存储.sincedb文件,每次都会重新解析logstash。但是如果你想每次都不重新解析那么你可以做的就是手动删除解析文件时创建的.sinceDb路径。通常,如果您不是root用户,则它在主目录中作为隐藏文件存在,否则在根目录中。 您还可以将sincedb_path设置为其他位置以轻松跟踪此文件。

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

答案 7 :(得分:0)

我在我的家庭目录中找到了它但删除后,logstash拒绝重新选择现有的日志文件。我开始工作的方式是添加

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

到我的文件插件。我想每次重置一次,只需改变sincedb_path的路径

答案 8 :(得分:0)

如果您使用tar.gz install filebeat,则可以删除此文件$FilebeatPath/data/registry/filebeat/data.json,然后重新运行filebeat

答案 9 :(得分:0)

尝试通过删除ENV中的/var/lib/logstash文件夹

答案 10 :(得分:0)

如上所示: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html#plugins-inputs-file-sincedb_path

您可以看到 Logstash 将保存一个 sincedb 文件,跟踪它已经看到并处理了哪个文件,直到哪一行。

如果您想删除现有的sincedb文件并且您没有自己定义sincedb_path,您可以在

<path.data>/plugins/inputs/file

默认情况下 保存值

LOGSTASH_HOME/data

默认情况下 LOGSTASH_HOME 保存该值

/var/lib/logstash

如果你想完全控制它,最好定义sincedb_path

答案 11 :(得分:0)

我建议:

sincedb_clean_after => 0
start_position => "beginning"

答案 12 :(得分:-1)

logstash版本5新目录位于

<path.data>/plugins/inputs/file

path.data定义在logstash.yml