如何在logstash中使用sincedb?

时间:2014-01-20 09:13:09

标签: elasticsearch logstash

我有成千上万的日志文件,每天都会下载。我正在使用logstash和ElasticSearch进行解析,索引和搜索。

现在我使用文件输入插件来读取下载的文件并解析它。我没有设置sincedb_path,因此将其存储在$HOME中。但问题是它只读取了一天的日志文件。这是我输入的配置:

input {
  file {
    path => "/logs/downloads/apacheLogs/env1/**/*"
    type => "env1"
    exclude => "*.gz"
    start_position => "beginning"
  }
  file {
    path => "/logs/downloads/appLogs/env2/**/*"
    type => "env2"
    exclude => "*.gz"
    start_position => "beginning"
  }
}  

4 个答案:

答案 0 :(得分:8)

这显然是由文件处理程序中的错误引起的。

当File {}输入法读取日志文件时,处理的最后一个字节将被保存并定期复制到sincedb文件中。虽然您可以根据需要将文件设置为/dev/null,但Logstash仅在启动时读取文件,并在之后使用内存中表的信息。

问题是内存中的表按inode索引位置,并且永远不会被修剪,即使它检测到给定文件不再存在。如果删除文件然后添加一个新文件 - 即使它有不同的名称 - 它可能具有相同的inode编号,并且文件处理程序会认为它是同一个文件。

如果新文件较大,则处理程序将仅从之前的最大字节开始读取并更新表。如果新文件较小,那么它似乎认为该文件被某种方式截断,并可能从默认位置再次开始处理。

因此,处理事情的唯一方法是将sincedb设置为/dev/null,然后重新启动logstash(导致内部表丢失),然后匹配模式的所有文件将从头开始重新阅读 - 这也有问题,因为有些文件可能不是新的。

答案 1 :(得分:1)

logstash是否有任何错误消息?

一个可能的问题是在linux系统中,每个用户打开文件的数量都有限制。 Logstash将打开logstash输入路径中的所有文件(/ logs / downloads / apacheLogs / env1 / * / )。因此,当您的日志文件超出限制时,logstash无法打开任何新日志文件并读取它们。您可以检查系统设置(/etc/security/limits.conf)。

编辑: 修改配置文件后,需要注销并重新登录。

答案 2 :(得分:1)

这是因为“ignore_older”。默认设置为86400,即1天。因此,如果提供的路径中存在的文件超过1天(未修改),则会被忽略。

您可以设置ignore_older => 0 这样就可以读取所有文件了。

您可以在https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html

上提交更多文件

答案 3 :(得分:0)

我知道这个问题很旧,但是我也遇到了类似的问题。需要读取文件,将其删除并等待第二天的新文件,但可悲的是它们将具有相同的inode。因此,史蒂夫·希普韦(Steve Shipway)所说的是正确的,也有在内存中存储sincedb,但是我已经能够在7.10版本中使用

sincedb_clean_after => 0

由于该选项实际上似乎可以清除信息,因为db文件和内存在信息存储中,并且具有相同inode的文件将被读取,因此无需将/ dev / null设置为sincedb路径。