【问题标题】:Understanding sincedb files from Logstash file input从 Logstash 文件输入中了解 sincedb 文件
【发布时间】:2015-01-16 13:28:07
【问题描述】:

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

sincedb 文件示例:

 286105 0 19 20678374

【问题讨论】:

    标签: logstash


    【解决方案1】:

    有4个字段(source):

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

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

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

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

    SolarisWindows 等某些特定架构中,存在 ruby​​ 错误地检测到等于 0 的 inode 编号的错误。这可能会导致诸如 logstash 未检测到文件轮换等问题。

    【讨论】:

    • 为什么不在你的自我回答中描述所有 4 个字段,也许更权威?
    • 我只是提供已经很难收集的稀有信息。我的目的不是开始一篇维基百科文章。无论如何,你让我意识到“字节偏移”对每个人来说并不明显,所以我添加了更多信息。
    【解决方案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 的详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多