项目上线后经常出现需要统计用户数据、接口请求等。完美的情况下,在项目开始前就设计好哪些request、中间过程需要落地到db、或以一定格式存入专门的log中,但也常需要同学们临时去业务日志中grep
大致分为三步:找到包含数据的行、提取出行中需要的数据、输出到文件并提取到本地
实践中用到的一种方式:
zcat /home/机器中的日志路径/logs/finscore.log.gz | grep 'TaskController.queryTaskListApi(..)的请求参数为' | awk -F\' '{print $}' > machine1_userId_2017-09-04.log
用到的命令:
- zcat:就是查看压缩文件的内容,如果日志未压缩,直接cat也行
- grep:找到包含数据的行
- awk:用法为 awk -F分隔字符 操作,比如awk -F: '{print $2}' 代表将当前数据按照英文冒号进行分割,并将分割后的第二段中的内容输出。需要注意分隔字符的转义。如果不写-F,默认会用空格作为分隔符
如果是ssh登录的线上机器,拷贝到本地,还需要在本地这样做:
scp 线上机器地址:machine1_userId_2017--.log /Users/micheal/temp/machine1_userId_2017--.log
scp是有Security的文件copy,基于ssh登录。操作起来比较方便,敲完命令后会提示输入那台机器的登录密码,接着就开始copy了
对于提取数据中的精髓:提取,除了awk还有很多方法,比如可以用cut:
cat userId_2017--04.log | cut -d \" -f 8 > userId_new_2017-09-04.log
cut命令:
- -d:分隔符,和awk的-F一样
- -f:分割后取第几段内容,如果要取多段:可以写 -f2-4,从第二段取到结尾:-f2-,从头取到第四段:-f-4;取第一段和第三段:-f1,3,随意组合(上文中awk中使用的print也有类似的语法,可以随意组合)
如果为多台机器,可以配合可分屏的terminal:
mac下推荐iTerm2:http://www.iterm2.com/,打开终端后分屏,然后广播output即可
linux:直接sudo apt-get install terminator