错误的命令:
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 都带的,所以舍近求远,看有没其它的解决方法。
tail -qFn0 caselog.log | while read line ; do; python -c "import sys, json, time; print(json.loads('$line')['type']);"; done
可以实现此功能,感谢提供思路。
过分一点,能不能再精简点呢?或者其它思路,因为毕竟是命令行,少打点字想必是极好的
1
AntonChen 2018-05-25 10:30:13 +08:00
|
2
widewing 2018-05-25 10:33:13 +08:00 via Android
楼主思路我觉得挺好的啊
|
3
lululau 2018-05-25 10:37:16 +08:00
如果每行是一个 JSON 对象,可以这样处理,但是在解析前先 readline
如果整个日志是一个 JSON 对象的话,要么把 -f 去掉(因为没有意义),要么用流式的 JSON Parser 不要用 python 写 one-liner,要写 one-liner 用 Perl / Ruby |
4
predator 2018-05-25 10:40:39 +08:00
可行,我干过,现在还在跑,没 WAF 的服务器把 nginx 日志 tail 给 php 脚本
|
5
lolizeppelin 2018-05-25 10:49:47 +08:00
如果只是简单过滤 直接 awk 就好
复杂处理直接整个用 python 实现 tail -f 的功能就好 |
6
greenskinmonster 2018-05-25 11:05:45 +08:00 1
按行处理的话可以这样,配合 supervisord 可以做 service 用
#!/bin/bash tail -qFn0 /var/log/sample.log | \ while read line ; do echo "$line" #do whatever you want done |
7
iyaozhen 2018-05-25 11:16:13 +08:00 via Android
|
8
byfar OP @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 ``` |
9
msg7086 2018-05-25 12:36:04 +08:00
tail -f caselog.log | jq '.type' 这样?
|
10
araraloren 2018-05-25 13:29:11 +08:00
用 python 显的太蹩脚了,这时候还不如 perl
tail -qFn0 caselog.log | perl -MJSON -nE 'say ((decode_json $_)->{type});' |
11
byfar OP |
12
luefei 2018-05-25 15:40:52 +08:00
这样处理过 apache 日志 =。=
|
13
Dearest 2018-05-25 18:25:02 +08:00
没看懂 tail -qFn0 里的 n0 参数, 为什么要把 line num 设为 0 呢 这样不就一行都不会输出了吗
|
14
rrfeng 2018-05-25 19:01:28 +08:00 via Android
不要用 Python,直接正则解决。grep awk sed 都行。
在这个场景里除非 JSON 结构很复杂导致必须要解析,否则 Python 是最慢的一环。 |
15
byfar OP |