我正在尝试从日志文件中计算每秒的 SQL 查询数,并且我想通过将 grep 的标准输出传送到某个命令中来实时执行此操作。(我正在做一些性能测试)
我可以自己写,但我确信这会存在。
我看了看 wc,但没有看到允许这样做的选项。
我还可以通过从访问日志中传输尾部来使用它来计算每秒的请求数。
答案1
pv
是你的命令!磷艾佩五iewer 打印通过它的数据的统计信息,并且可以在管道中的任何位置运行,因为它将 stdin 直接传输到 stdout。例如:
tail -f /var/log/nginx/access.log | pv --line-mode --rate > /dev/null
该pv
命令将当前每秒的行数(默认值为每秒字节数)打印到 stderr,对于此特定数据源(Nginx 的默认日志文件),这相当于每秒传入的 Web 请求数。我只关心计数,因此我将 stdout 导入/dev/null
。还有以下选项:
-b
(总行数),--average-rate
(自开始以来的平均利率),以及--timer
(追踪管道运行的时间)。
如果您不说--line-mode
,它将计算字节数,这可能不是您想要的服务器日志,但在其他地方可能会很方便。
最后说明:... | pv -lb > file.txt
与非常相似... | tee file.txt | awk '{printf "\r%lu", NR}'
,这对于计算行数也很方便,但是调用方式pv
更短,尽管输出并不那么令人兴奋——pv
默认情况下每秒更新一次,而该awk
命令会持续更新。
答案2
也许你应该尝试一下logtop
?
tail -f foobar.log |logtop
答案3
watch -n 3 "wc -l logfile"
手册页
watch - 定期执行程序,全屏显示输出 默认情况下,程序每 2 秒运行一次;使用 -n 或 --interval 指定不同的间隔。
答案4
如果您所在的系统无法安装pv
或logtop
按照上述方法操作,并且日志文件太大而无法读取整个文件wc
,那么您可以对其进行尾部监视:
MYLOGS=$(timeout 10 tail -f /path/to/log.log)
expr $(echo "$MYLOGS" | wc -l) / 10