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

96

我安装了Logstash来解析Apache文件。 调整设置花费了我相当长的时间,我一直在真实的日志上尝试。 我注意到(正如文档所说)logstash会“记住”它在文件中的位置。 现在我的设置是正确的,我希望Logstash“忘记”。 这似乎比我想象的更难。 我已经执行了以下操作:

  • 使用:start_position =>“beginning”

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

  • 查看Logstash打开的哪些文件,并删除其中有希望的所有内容(在我的情况下为/ tmp / jffi *.tmp

仍然存在问题,Logstash不会忘记,而是只解析存储在日志文件夹中的“新鲜”文件。

有任何想法吗?


我找到的最新的Logstash版本在/opt/logstash/data/plugins/inputs/file - Tim Smith
14个回答

142

默认情况下,logstash将最后一次读取的位置写入日志文件,该文件通常驻留在$HOME/.sincedb中。 通过指定/dev/null作为sincedb_path,可以让logstash认为它从未解析过日志文件。

这是Input File文档的一部分。

将since数据库写入何处(跟踪监视的日志文件的当前位置)。 默认值为环境变量“$SINCEDB_PATH”或“$ HOME/.sincedb”的值。

配置示例

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

32
在Windows上,您可以使用 sincedb_path => "NUL" 来获得相同的效果。详情请查看此处 - Chris Magnuson
12
如果文件非常旧(超过24小时),非常有用的是添加选项“ ingnore_older => 0 ”,这样logstash将无论日期如何都会将它们读取。默认情况下,如果文件超过24小时,则会被忽略。 - mtfk
1
@mtfk:哇,太棒了!感谢你指出在logstash中ignore_older => 0可以解决问题!我也曾被提问者遇到的同样问题困扰过。这似乎是一个不太明显的发现!(在谷歌上搜索“ignore_older”和“logstash”只会带来有关filebeat的页面,我找不到任何关于如何处理这个问题的迹象) - Mike Lutz
如何在使用Filebeat时添加此内容 - Sunilkumar Ramamurthy
@SunilkumarRamamurthy我认为,如果您在filebeat配置中省略了“ignore_older”选项,那么filbeat将被强制重新读取整个文件。https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html#ignore-older - flazzarini

21

插件文件会将“尾随”历史记录存储在sincedb文件中,默认位置为$HOME/.sincedb*,详情请参见http://logstash.net/docs/1.3.3/inputs/file#sincedb_path

Sincedb文件包含类似于以下行的内容:

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

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

  • 删除sincededb文件
  • 或者仅删除sincedb文件中相应行的内容,在文件的inode号之前检查您的文件(ls -i yourFile | awk '{print $1}' )
  • 然后重新启动Logstash

使用关键字start_position => "beginning",Logstash将分析整个文件。

sincedb文件的示例:


2
关于 start_position => "beginning",文档中说:>此选项仅修改文件是新的且以前未见过的“第一次接触”情况。如果文件以前已经被看到过,则此选项无效。 - Brad

11

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


10

综合所有答案,我猜这是解析文件的最佳方法。我在测试中也是这样做的。

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

为了进行快速测试,您可以使用 touch /tmp/access_log 更改文件的时间戳,而不是使用 ignore_older


请注意,添加配置ignore_older => 0将产生相反的效果。 - panchicore

5

如果您正在使用logstash-forwarder,请检查您的主目录中是否有.logstash-forwarder文件:

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

3
如果已经安装为包,请检查/var/lib/logstash-forwarder/ - Wesley Baugh

3

删除$HOME/.sincedb_*后,我仍然无法摄取数据。

尝试了很多方法后,我从/etc/logstash/conf.d中删除了除主要的.conf文件以外的所有文件,并重新启动了Logstash,一切都正常工作。我只能猜测其中一个.conf文件中有些东西让logstash悄悄地停下来了。


据我回忆,后来我打开了一些调试标志,它告诉我为什么它生气了而不是默默地挂起。我想它在数据中寻找版本号,但有时数据中没有数字。如果检查不是数字,那么查找数字的过程会崩溃,因此我必须先测试它是否为数字,然后再询问它是什么数字。 - Seth

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

1
实际上,如果文件中有大量数据,则每次重新解析都非常耗费资源。因此在执行此操作之前需要谨慎考虑。 如果我们想强制重新解析,则需要在输入块内设置参数。
sincedb_path => "/dev/null" 

这个选项不会存储 .sincedb 文件,logstash 每次都会重新解析。但是如果你只想偶尔重新解析,而不是每次都重新解析,那么你可以手动删除在解析文件时创建的 .sinceDb 路径。通常情况下,如果你不是 root 用户,则它位于主目录中作为隐藏文件,否则位于根目录中。你还可以将 sincedb_path 设置为其他位置以便轻松跟踪此文件。
sincedb_path => "/home/shubham/sinceDB/productsSince.db"

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

默认情况下,<path.data> 保存了该值

LOGSTASH_HOME/data

默认情况下,LOGSTASH_HOME保存着一个值。
/var/lib/logstash

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接