我有成千上万的日志文件,每天都会下载。我正在使用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"
}
}
答案 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路径。