从Logstash文件输入中了解sincedb文件

时间:2015-01-16 13:28:07

标签: logstash

file input与Logstash一起使用时,会写入sincedb文件以跟踪受监视日志文件的当前位置。如何理解其内容?

sincedb文件的示例:

 286105 0 19 20678374

2 个答案:

答案 0 :(得分:18)

有4个字段(source):

  • 索引节点
  • 主设备号
  • 次要设备编号
  • 字节偏移

假设硬盘将被分割成数千个非常小的部分,并且每个部分都有一个数字,则inode将或多或少地类似于文件开始的小部分的数量。因此,给定的inode对于每个硬盘都是唯一的,但是为了解决同一服务器上有多个磁盘的情况,需要使用主设备号和次设备号以保证三元组{inode,次设备号的唯一性,次要设备号}。有关Wikipedia上的inode的更准确信息。

那就是说,我不太确定(例如)通过NFS挂载的文件不能与本地文件冲突,因为通过NFS挂载的文件的inode似乎是远程文件。即使我不认为插件编写者对这种情况感到困扰,尽管我自己使用了NFS,但到目前为止从未遇到任何麻烦。我还怀疑碰撞概率非常小。

现在有了由inode和主要和次要设备编号组成的三元组,我们有一种方法可以定位插件正在读取的单个日志文件而不会出错(或者至少是原始意图)。最后一个数字,即字节偏移量,跟踪已经读取并输出到Logstash的输入日志文件的距离。

在某些特定体系结构中,例如SolarisWindows,有一些错误,ruby错误地检测到inode编号,这等于0.这可能会导致logstash没有检测到文件等问题转动。

答案 1 :(得分:2)

这非常有帮助。我想将所有的SinceDB文件映射到logstash输入,所以我把一个小的bash双线程放在一起打印这个映射。

filesystems=$(grep path /etc/logstash/conf.d/*.conf | awk -F'=>' '{ print $2 }' | xargs -I {} df -P {} 2>/dev/null | grep -v Filesystem | sort | uniq | cut -d' ' -f 1)
for fs in $filesystems; do for f in $(ls -a .sincedb_*); do echo $f; inodes=$(cut -d' ' -f 1 $f); for inode in $inodes; do sudo debugfs -R "ncheck $inode" $fs 2>/dev/null | grep -v Inode | cut -f 2; done; echo; done; done

我刚刚记录了有关mapping SinceDB files to logstash input的详细信息。