logstash在第一次导入数据时将自动创建一个文件监控记录(sincedb),则logstach会认为该文件已经读取过,即使删除索引,也不会重头读取。导致重新运行logstash会发现记录量非常少,可能只有几十条或者几百条。有多种解决办法
其实这个也不是只适用于messages文件,只是我在初学时导入messages碰到了这个问题,后续可能也会继续更新一些其他beat导入后数据量变少的解决方案
一、禁止sincedb(不连接beat)
在logstash配置文件中加入代码行sincedb_path => "/dev/null",即
input {
file {
path => "/var/log/messages"
type => "systemlog"
start_position => "beginning"
stat_interval => "2"
sincedb_path => "/dev/null"
}
}
output {
elasticsearch {
hosts => ["172.31.187.59:9200"]
index => "logstash-systemlog-test"
}
}
利用这行代码,会禁止sincedb,此时运行时无法读取到监听记录,于是会认为未读取过文件,从头读取。
二、清空sincedb(不连接beat)
清空logstash-input-file插件的文件监控记录(sincedb)。利用命令找到sincedb文件并删除,重新启动
注意删除sindb之前要将logstash停止运行,否则可能会报错。
依次运行以下指令:
# 停止logstach
systemctl stop logstash
# 找到文件
find / -name .sincedb_*
# 转到目录
cd /var/lib/logstash/plugins/inputs/file/
# 删除文件
rm .sincedb_*
# 重新运行
systemctl restart logstash
运行后到head查看,这时应该已经有了相关的记录,有可能有延时可以多刷新几次。
三、Filebeat+Logstash
如果是使用Filebeat通过端口传输到Logstash,那么要处理的内容就是Filebeat这边的读取记录,在filebeat的执行路径下有一个registry文件,终止Filebeat后,再删除此文件,可以直接用查找命令查到文件。但要注意我们要删的是在filebeat下的记录。
# 查找filebeat进程
ps -ef |grep filebeat
# 终止
kill -9 XXXX
# 找到记录文件
# find / -name registry
# 删除
rm -rf /var/lib/filebeat/registry
# 启动
systemctl restart filebeat
再看数据就会发现恢复到万的量级了
但是这些方法有一个缺陷,如果未删除索引,多次运行,会导致数据量重复和倍增。当索引数量过多时,没掌握快速删除索引的方法(比如我),就会变得很麻烦,效率很低。所以建议在前期不要创建通用的命名方式形成过多索引,可以用一个test测试方便删除,或是命名格式以月份而不是天数为主,就会大大降低索引数量
参考博客