你的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,造成了这个脚本很繁琐。如何简化,各位读者可以自行研究。