如何在logstash中使用sincedb?

Ana*_*nda 7 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"
  }
}  
Run Code Online (Sandbox Code Playgroud)

Ste*_*way 8

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

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

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

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

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