tail -f 文件,结果交给 Python -c 处理, 思路是否可行?

2018-05-25 09:58:06 +08:00
 byfar

错误的命令:

tail -f case.log | python -c "import sys, json, time; print(json.load(sys.stdin)['type']);"

此命令想要的结果: tail -f 一个文件, awk 或其它命令取到 json, 通过管理交给 python 处理. python 解析 json 并打出需要的字段.

jq 命令可以解决这个问题,不过服务器太多,不好在每台服务上装这个命令。python 却是 linux 都带的,所以舍近求远,看有没其它的解决方法。

4440 次点击
所在节点    Python
16 条回复
AntonChen
2018-05-25 10:30:13 +08:00
https://gist.github.com/antonchen/0a3c513e2b09b04e2c60b52f96ccb091

手写的不知道能不能跑,反正是这个思路
widewing
2018-05-25 10:33:13 +08:00
楼主思路我觉得挺好的啊
lululau
2018-05-25 10:37:16 +08:00
如果每行是一个 JSON 对象,可以这样处理,但是在解析前先 readline
如果整个日志是一个 JSON 对象的话,要么把 -f 去掉(因为没有意义),要么用流式的 JSON Parser
不要用 python 写 one-liner,要写 one-liner 用 Perl / Ruby
predator
2018-05-25 10:40:39 +08:00
可行,我干过,现在还在跑,没 WAF 的服务器把 nginx 日志 tail 给 php 脚本
lolizeppelin
2018-05-25 10:49:47 +08:00
如果只是简单过滤 直接 awk 就好

复杂处理直接整个用 python 实现 tail -f 的功能就好
greenskinmonster
2018-05-25 11:05:45 +08:00
按行处理的话可以这样,配合 supervisord 可以做 service 用

#!/bin/bash

tail -qFn0 /var/log/sample.log | \
while read line ; do
echo "$line"
#do whatever you want
done
iyaozhen
2018-05-25 11:16:13 +08:00
用 tail -f 和 subprocess 实现过简单解析后推送到下游的脚本,稍微改改应该能满足楼主的需求

https://github.com/iyaozhen/filebeat.py
byfar
2018-05-25 11:50:12 +08:00
@AntonChen 收下大佬的思路

@lululau
@lolizeppelin
@iyaozhen
我的场景,一行一个条日志,其中一小部分是一条 json, 所以会用 awk 或其它切成 json 再管道给后面,不写脚本是因为能一行命令解决的,我就没想写个脚本了。

@predator

@widewing
@greenskinmonster
赞赞赞,可以实现我想要的
```
tail -qFn0 caselog.log | while read line ; do; python -c "import sys, json, time; print(json.loads('$line')['type']);"; done
```
msg7086
2018-05-25 12:36:04 +08:00
tail -f caselog.log | jq '.type' 这样?
araraloren
2018-05-25 13:29:11 +08:00
用 python 显的太蹩脚了,这时候还不如 perl

tail -qFn0 caselog.log | perl -MJSON -nE 'say ((decode_json $_)->{type});'
byfar
2018-05-25 13:40:12 +08:00
@msg7086
是的 jq 可以解决

@araraloren
是个好思路
luefei
2018-05-25 15:40:52 +08:00
这样处理过 apache 日志 =。=
Dearest
2018-05-25 18:25:02 +08:00
没看懂 tail -qFn0 里的 n0 参数, 为什么要把 line num 设为 0 呢 这样不就一行都不会输出了吗
rrfeng
2018-05-25 19:01:28 +08:00
不要用 Python,直接正则解决。grep awk sed 都行。
在这个场景里除非 JSON 结构很复杂导致必须要解析,否则 Python 是最慢的一环。
byfar
2018-05-25 22:27:08 +08:00
@luefei
同需求

@Dearest
man tail
...
-n number
The location is number lines.
...
n0 只显示命令执行后追加到文件中的内容
n100 显示执行命令时最后 100 行,并把命令执行后追加到文件内容显示出来
解释得不好,手动测试一下便知。这里有没有 n0 影响不大,舍弃命令执行前内容可便于观察。

@rrfeng
正解
123q321
2018-05-26 10:08:55 +08:00
@byfar 求大神 QQ

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/457641

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX