【发布时间】:2015-01-16 13:28:07
【问题描述】:
在将file input 与 Logstash 一起使用时,会写入一个 sincedb 文件以跟踪受监控日志文件的当前位置。如何理解其内容?
sincedb 文件示例:
286105 0 19 20678374
【问题讨论】:
标签: logstash
在将file input 与 Logstash 一起使用时,会写入一个 sincedb 文件以跟踪受监控日志文件的当前位置。如何理解其内容?
sincedb 文件示例:
286105 0 19 20678374
【问题讨论】:
标签: logstash
有4个字段(source):
假设硬盘将被分割成数千个非常小的部分,每个部分都有一个编号,那么 inode 将或多或少类似于文件开始的微小部分的编号。所以给定的inode对于每个硬盘都是唯一的,但是为了解决同一服务器上有多个磁盘的情况,需要使用主要和次要设备号来保证三元组的唯一性{inode,次要设备号,次设备号}。 Wikipedia 上有关 inode 的更准确信息。
也就是说,我不太确定(例如)通过 NFS 挂载的文件不会与本地文件发生冲突,因为通过 NFS 挂载的文件的 inode 似乎是远程文件。尽管我不认为插件编写者会为这种情况而烦恼,尽管我自己使用 NFS,但到目前为止从未遇到任何麻烦。另外我怀疑碰撞概率非常小。
现在有了由 inode 和主要和次要设备号组成的三元组,我们有一种方法可以定位插件正在读取的单个日志文件而不会出错(或者至少这是最初的意图)。最后一个数字,字节偏移量,跟踪输入日志文件已经被读取并输出到 Logstash 的距离。
在Solaris 或Windows 等某些特定架构中,存在 ruby 错误地检测到等于 0 的 inode 编号的错误。这可能会导致诸如 logstash 未检测到文件轮换等问题。
【讨论】:
这非常有帮助。我想将我所有的 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 的详细信息。
【讨论】: