如何sort&grep多台服务器上的日志

你的web service没有统一的日志服务器,每台服务器日志都直接写在本地。
突然服务出现问题了,你想查看日志,怎么办?难道每台服务器挨个登陆查看,然后再汇总?
弱爆了,首先推荐it牛人老王介绍的clustershell。
有了这个工具一句话

clush -L -g 服务器名字 "cat /日志路径/分日日志名.log"


可是现在显示的日志并没有按照访问顺序排序。
好的,现在给大家提供一个脚本,用于访问日志sort&grep

介绍一下日志格式。首先,为了看起来方便将'data'.'[type][className][functionName]: '.var_export($params, true)直接写入日志。
然而,这样就无法以回车来区分每行日志了,所以每写入一条日志同时写入'\n'.
生成了如下格式的访问日志。
12-31-2011 11:07:07 CST [info][AAdapter][generate]: '初曦'

12-31-2011 11:07:07 CST [info][AAdapter][receive]: array (
'id' => '121665',
'userName' => '初曦',
'loginTime' => '1321116350',
)

12-31-2011 11:07:09 CST [info][AAdapter][receive]: array (
'id' => '13224',
'userName' => 'somename',
'loginTime' => '1325300826',
)

脚本:命令格式

 ./scriptName logName grepKeyword
grepKeyword不写,则返回所有日志

脚本内容:

1. 汇总日志

2. awk删除服务器名字

3. awk将每条日志由多行处理为一行,原来每行之间用'|'分割

4. sort&grep ‘|’

5. 将每条日志恢复为原来多行的形式

#! /bin/sh
GREP=${2:-'|'}
clush -L -g sshServerName "cat /logPath/$1.log" 2>/dev/null | 
while read first else; 
do 
  echo $else; 
done | 
awk 'BEGIN{
  RS="";  
  FS="\n"; 
  OFS="|";   
  ORS=""
}
{
  for(i=1;i<=NF;i++) 
    printf("%s|",$i); 
  print "\n";
}'  | 
sort|
grep "$GREP"|
awk 'BEGIN{
  RS="\n"; 
  FS="|"; 
  ORS="\n";
}
{
  for(i=1;i<=NF;i++) 
    print $i; 
}'

当初写脚本的时候,对clustershell还有很多不了解的地方,甚至现在也不是很了解,造成了本可以用clustershell进行的文本处理,我却直接用的awk,造成了这个脚本很繁琐。如何简化,各位读者可以自行研究。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值