Logstash无法读取文件的更新内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Logstash无法读取文件的更新内容相关的知识,希望对你有一定的参考价值。
参考技术A 最近工作中正在用ELK搭建一套数据平台,通过Logstash(以下简称LS)读取文件的内容,然后同步给ES。文件的内容是用Python脚本生成的,文件名一直不变,即每次Python脚本是往同一个文件里覆盖的去写,demo如下:python demo t.py
Logstash demo t.conf
结果超级诡异的现象出现了!!LS并不读取文件的内容,只有手动vim去修改一下文件,LS才会读数据。
最开始以为是file input插件的参数那里设置的不对,然后在官方的社区里搜到了这个问题 https://discuss.elastic.co/t/file-plugin-doesnt-read-file/49052/3 ,提问者的问题跟我一模一样,下面有人回答是ignore_older参数捣的鬼,然后提问那哥们把ignore_older参数值改了后,问题解决了。我以为这就找到答案了,就去看 ignore_older 参数的定义,摘抄如下:
在 https://discuss.elastic.co/t/logstash-sincedb-files/95297/2 中详细说明了.conf文件中的path参数中的每一个路径对应1个sincedb文件,如果文件路径有通配符,如“/Applications/logstash-5.6.3/test .json”,则Logstash会把读取test .json文件的相关信息统一放在一个sincedb文件中,而不是每一个文件一个sincedb文件。
另外这个链接里也说了LS读取文件的规则,这个稍后再说。先看下sincedb文件的内容:
文件里一行数据包含4个数,分别代表inode number、major device number、minor device number和current byte offset。
其中inode,major device,minor device是操作系统的文件系统的概念。current byte offset表示上一次文件读取的位置。
Logstash不读取文件的问题就出在inode上。简单理解,inode记录一个文件的属性,如文件的字节数、userId、groupId,读写执行权限等。一个文件对应一个inode。
上面的链接中说了LS读取文件和inode的关系,引用如下:
即当文件滚动(rotation,参考: logrotate机制和原理 )的时候,文件的inode是不会变化的,这时:
所以,之前我本地测试Py demo的时候,每次往同一个文件里覆盖写的内容是一模一样的,文件大小没有变化,所以LS不会去读文件的内容。只要每次文件更新的内容造成文件大小有变化,LS就可以读数据了,但这也不符合我的需求。毕竟每次我写的都是全新的内容,而且新写的内容可能和上一次的内容是一模一样的(业务上的要求),这样LS就不读数据了。另外,即使内容不完全一样,若新的内容大于offset的话,LS读取出来的内容是不全的(因为从上一次的offset开始读,前面的内容忽略了)。
又在这个链接中 https://discuss.elastic.co/t/logstash-is-not-reading-the-log-file-thats-being-updated-automatically-continuously/92686/7 看到文件重读的机制:
一是文件的inode变化了,即新生成一个文件;二是如之前所说的文件rotate。
所以可以通过每次都往一个新文件里写内容(新的inode),在.conf中使用通配符:
这样,sincedb会新增一行记录新inode的内容,新文件的内容也可以全部被Logstash读取了。
这也解释了为什么之前需要我手动去编辑一下文件,就可以被Logstash读取了,因为每次编辑后,文件的inode就已经变化了。
可以试一下:
在mac上,源文件的inode号是13326659,然后vim编辑下文件(随便改1个数),再保存:
发现文件的inode号变成13334123了,对于LS来说是一个新文件,内容全部被读。 至于vim为啥会改变文件的inode号:
即vim修改文件的背后机制是重命名该文件,然后新建一个文件和源文件名一样,再把原文件的内容写入新建文件里。
虽然因为本地测试每次写的都是同样的内容导致在解决问题的道路上绕了一大圈,但也通过这一大圈了解了LS读取文件的机制,总比稀里糊涂的用要好很多吧,而且在这个过程中了解了inode,还有rotate,收获也不小~
logstash无法使用conf启动
最近刚开始学习使用logstash,再安装好后准备验证下第一个demo的时候,出现了问题
Error: Expected one of #, input, filter, output at line 1, column 1 (byte 1) after
配置文件内容如下
从错误提示来看 应该是不能识别配置文件的内容,我尝试了更换版本,在win或者linux环境搭建logstash进行测试,均不能成功,linux环境的配置文件是win上共享上去的。
通过搜索引擎检索了一番,发现也有类似的问题,英文,但是没有解决方案。。。
继续找,看到曙光了!!在日志易的开发指导中看到了搭建logstash注意事项
赶紧修改文件格式后继续测试,我原来使用的仅仅是UTF-8格式
成功了~~
可以继续我的学习之旅了,记录这篇文章希望遇到和我一样的同学能快速定位到问题。
以上是关于Logstash无法读取文件的更新内容的主要内容,如果未能解决你的问题,请参考以下文章
Logstash 将所有内容放入所有 Elasticsearch 索引中
如何使用filebeat读取json文件并通过logstash发送到elasticsearch