答案 0 :(得分:18)
有4个字段(source):
假设硬盘将被分割成数千个非常小的部分,并且每个部分都有一个数字,则inode将或多或少地类似于文件开始的小部分的数量。因此,给定的inode对于每个硬盘都是唯一的,但是为了解决同一服务器上有多个磁盘的情况,需要使用主设备号和次设备号以保证三元组{inode,次设备号的唯一性,次要设备号}。有关Wikipedia上的inode的更准确信息。
那就是说,我不太确定(例如)通过NFS挂载的文件不能与本地文件冲突,因为通过NFS挂载的文件的inode似乎是远程文件。即使我不认为插件编写者对这种情况感到困扰,尽管我自己使用了NFS,但到目前为止从未遇到任何麻烦。我还怀疑碰撞概率非常小。
现在有了由inode和主要和次要设备编号组成的三元组,我们有一种方法可以定位插件正在读取的单个日志文件而不会出错(或者至少是原始意图)。最后一个数字,即字节偏移量,跟踪已经读取并输出到Logstash的输入日志文件的距离。
在某些特定体系结构中,例如Solaris或Windows,有一些错误,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的详细信息。