Logstash解析进度条

Logstash parsing progress bar

我是 Logstash 的新手,我正在使用它来解析特定目录中的 500MB 日志文件,目前当我启动 logstash 时,它不会显示已完成多少百分比的任何进度条解析日志文件。有什么办法可以看到日志解析完成的进度吗?

不,Logstash 没有内置的进度条功能。大多数时候这没有任何意义,因为 Logstash 旨在连续处理不断增长的日志,然后实际上没有任何 "done".

您可以做的是将 sincedb 文件的内容与相应文件的文件大小相关联。 sincedb 文件是 Logstash 在文件中存储当前偏移量的地方。在 file input's documentation 中可以找到文件格式的准确描述,但您主要需要关心第一列和最后一列。第一列是 inode 编号,也可以在文件的 ls -li 输出中找到,最后一列是当前偏移量。示例:

393309 0 64773 437

这里,对于 inode 为 393309 的文件,Logstash 位于偏移量 437。

join 命令可用于将此文件与 ls -li 输出(文件的 inode 编号在第一列中)相结合:

$ join /var/lib/logstash/.sincedb_f5fdf6ea0ea92860c6a6b2b354bfcbbc <(ls -li /var/log/syslog)
393309 0 64773 437 -rw-r----- 1 root adm 437 Oct 15 12:47 /var/log/syslog

最后,awk 可用于清理输出并生成完成百分比数字:

$ join /var/lib/logstash/.sincedb_f5fdf6ea0ea92860c6a6b2b354bfcbbc <(ls -li /var/log/syslog) | awk '{ printf "%-30s%.1f%\n", , 100 *  /  }'
/var/log/syslog               100.0%

我修改了 Magnus 的脚本,将尚未解析的文件也列为 0.0%:

PATH_TO_SINCEDBS=/var/data/logstash/plugins/inputs/file
FILES_TO_BE_PARSED="/tmp/*.log /log/*.log /log/parsed/*.log"

tmpfile=$(mktemp); tmpfile2=$(mktemp)

sort ${PATH_TO_SINCEDBS}/.sincedb_* | awk '{ print " " }' > ${tmpfile}
stat -c "%i %n %s" ${FILES_TO_BE_PARSED} | sort > ${tmpfile2}

join ${tmpfile2} ${tmpfile} -a 1 | awk '{ printf "%-30s %.1f%\n", , 100 *  /  }'

rm -f ${tmpfile} ${tmpfile2}

不幸的是,当您将带有 'start_position => "beginning"' 的文件输入文件与 Logstash 5 一起使用时,它在完成之前不会向 sincedb 文件写入任何内容 - 或者至少这是我得到的行为.