我想从嵌入式设备中收集实时日志。该设备的命令有限。如果我可以通过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流(可能是长连接?)。
由于
答案 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