如何将tail -f输出重定向到curl(HTTP流)

时间:2017-09-09 15:47:08

标签: linux shell http curl

我想从嵌入式设备中收集实时日志。该设备的命令有限。如果我可以通过shell脚本来做它会很棒。

那么,我可以做这样的事情tail -f /var/logs/some-log.log | curl -X POST --data-urlencode @- http://<log-collaction.website>吗?

我尝试了很多方法,但都失败了。例如:

ping www.google.com | while read -r LINE; do curl -X POST --silent --data-binary $LINE "http://localhost:8080/"; done

以上命令有效,但会逐行发布消息。但是,如果我要发送大量内容,我认为性能不佳。

我知道HTTP / 1.1支持分块编码。如何将程序的标准输出重定向到curl或HTTP流(可能是长连接?)。

由于

2 个答案:

答案 0 :(得分:2)

您可以使用buffer之类的工具(或者更好的mbuffer)来结合这两种策略。

tail -f  /var/logs/some-log.log | buffer | while read -r LINE; do curl -X POST --silent --data-binary $LINE "http://localhost:8080/"; done

这会减少curl到您的Web服务的HTTP请求数量(但可能会在您的连接中断时丢失一些日志)。

但是,我同意Nick Russo的观点,即完全实现websockets可能是一个更好的主意。

希望这有帮助!

答案 1 :(得分:0)

这是分组策略的开始,它并不关心换行符:

while sleep .1; do uptime; done | while LINE=$(dd iflag=fullblock count=2); do echo "$LINE"; done

第一个while loop只是一个虚拟数据生成器,可以让这个例子微不足道。最后的echo代表curl命令。

这是 关注换行符的策略:

#!/bin/bash

count=0
while sleep .1; do uptime; done | while read -r LINE
do
  count=$[count+1]
  if test "$count" -ge 10
  then
    echo "$ACCUMULATOR"
    ACCUMULATOR="$LINE"
    count=0
  else
    ACCUMULATOR+="
$LINE"
  fi
done