Logstash sincedb_path配置失效求助:指定路径无文件,不想用替代方案
我之前也碰到过一模一样的情况,自定义了sincedb路径后完全没输出,排查下来大多是权限、配置位置或者路径有效性的问题,给你几个针对性的解决步骤:
先检查目录和文件的权限
Logstash运行时使用的用户(通常是logstash用户)必须对/mnt/elk/logstash/scripts/sincedb目录有读写权限。你可以用以下命令排查:# 查看目录权限和所有者 ls -ld /mnt/elk/logstash/scripts/sincedb # 给logstash用户赋权(如果需要) chown -R logstash:logstash /mnt/elk/logstash/scripts/sincedb chmod -R 755 /mnt/elk/logstash/scripts/sincedb很多时候就是权限不足导致Logstash无法创建或写入自定义的sincedb文件,这是最常见的原因。
确认sincedb_path的配置位置正确
一定要确保sincedb_path是写在file input插件的配置块内部,而不是全局配置或者其他插件(filter/output)里。比如正确的配置应该是:input { file { path => "/path/to/your/nifi/logs/*.log" sincedb_path => "/mnt/elk/logstash/scripts/sincedb/from_nifi_dev_logs_nifi_6" # 其他file input配置项... } }如果把
sincedb_path写在input块外面,Logstash根本不会识别这个配置。手动创建并初始化sincedb文件
有时候Logstash不会自动创建新的sincedb文件(尤其是第一次使用自定义路径时),你可以手动创建文件并赋予权限:touch /mnt/elk/logstash/scripts/sincedb/from_nifi_dev_logs_nifi_6 chown logstash:logstash /mnt/elk/logstash/scripts/sincedb/from_nifi_dev_logs_nifi_6如果需要从日志文件的当前位置开始读取,你还可以手动写入sincedb的记录格式:先获取日志文件的inode和大小:
stat -c "%i %s" /path/to/your/target/logfile.log然后把输出的两个值(inode和文件大小)按照
inode|device|position|timestamp的格式写入sincedb文件,比如:123456 789 0 1718000000(device可以填0,timestamp填当前时间戳即可)
检查Logstash日志找报错信息
直接查看Logstash的运行日志(通常在/var/log/logstash/logstash-plain.log),搜索sincedb相关的关键词,比如Permission denied、Could not open sincedb file,这些报错会直接告诉你问题所在。验证file input的path配置正确性
如果你的file input的path配置没有匹配到任何日志文件,Logstash自然不会生成或更新sincedb文件。可以先手动确认path指向的日志文件存在,并且Logstash用户能读取这些文件。
按照这些步骤排查下来,基本就能解决自定义sincedb_path失效的问题,不用被迫使用start_position => beginning或者/dev/null的方案。
内容的提问来源于stack exchange,提问作者databeata

