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


91

我安装了Logstash来解析apache文件。我花了相当长的时间才能正确完成设置,而且我总是尝试使用真实的日志。我注意到(如文档所述)logstash“记住”文件中的位置。现在我的设置还可以,我希望Logstash“忘记”。这似乎比我难。我已经做了以下工作:

  • 用过的: start_position => "beginning"

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

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

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

有任何想法吗?


我在以下位置找到了最新的logstash版本:/opt/logstash/data/plugins/inputs/file
蒂姆·史密斯

Answers:


135

默认情况下,logstash将位置最后一次写入通常位于的日志文件中$HOME/.sincedb。通过指定/dev/null为,可以使Logstash相信自己从未解析过日志文件sincedb_path

这里是文档输入文件的一部分。

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

配置示例

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

28
在Windows上,您可以使用sincedb_path => "NUL"以获得相同的效果。这里的
克里斯·马格努森

11
如果文件很旧(超过24小时),则添加选项非常有用,ingnore_older => 0这样logstash可以将它们带到任何日期。默认情况下,如果文件较旧,则24h将被忽略。
mtfk '16

1
@mtfk:很棒的发现!感谢您指出ignore_older => 0logstash中的作品!我一直被提问者所困扰。似乎是一个非显而易见的发现!(搜索“ ignore_older”和“ logstash”只会在filebeat上显示页面,我在logstash中找不到如何处理此问题的任何线索)
Mike Lutz

如何在使用filebeat时添加此内容
Sunilkumar Ramamurthy

@SunilkumarRamamurthy我相信,如果您ignore_older在filebeat配置中省略该选项,则filbeat将被迫再次读取整个文件elastic.co/guide/en/beats/filebeat/current/…–
flazzarini

19

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

since db文件包含以下行:

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

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

  • 删除sindedb文件
  • 仅删除sincedb文件中的相应行,请检查文件(ls -i yourFile | awk '{print $1}')之前的索引节点号
  • 并重新启动Logstash

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

sincedb文件的示例:


1
关于start_position => "beginning",文档说:>此选项仅修改文件为新文件且之前未出现的“首次联系”情况。如果以前已经看过文件,则此选项无效。
Brad 2015年

10

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


9

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

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

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


请注意,添加配置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/
韦斯利·鲍尔

3

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

经过一堆尝试之后,我.conf从主目录中删除了除主文件之外的所有文件,/etc/logstash/conf.d然后重新启动了Logstash,一切正常。我只能假设.conflogtash静默地挂在其中一个文件中。


我记得,后来我打开了一些调试标志,它告诉我为什么它生气而不是默默地挂起。我认为它正在寻找数据中的版本号,但有时数据中没有编号。如果不是数字,则检查以找出数字是多少将导致崩溃,因此我必须首先测试它是数字,然后再询问它是什么数字。
赛斯

1

如果文件中包含大量数据,则实际上每次重新解析的成本都很高。因此,在执行此操作之前,您需要小心。如果我们要强制其重新解析,则在输入块内设置参数

sincedb_path => "/dev/null" 

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

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

1

如果您想避免与logstash选项混淆,我发现重命名或删除现有日志文件并从旧文件内容中创建一个文件将使Logstash误入重新索引。


0

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

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

到我的文件插件。我认为每次都要重置,只需更改sincedb_path的路径


0

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



-1

logstash版本5的新目录位于

<path.data>/plugins/inputs/file

path.data定义在logstash.yml中

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.