第四章 系统的稳定性
==在线日志分析==
@日志分析常用命令
1,cat命令是一个显示文本文件内容的快捷工具,如果文件较小,可以直接使用它,带上-n参数,可显示行号
#cat -n access.log
2,more命令可分页显示文件,按Enter键可显示下一行,按空格键显示下一页,按F键显示下一屏,按B键显示上一屏
#cat -n access.log
less命令提供比more更丰富的功能,支持内容查找,并且能高亮显示
#less access.log
使用/GET查找字符串GET,并高亮显示
3,显示文件尾
使用tail命令能够查看到文件最后几行,这对于日志文件非常有效,因为日志文件常常是追加写入的。
#tail -n4 access.log
-n参数跟上数字表示显示文件最后几行,这里的4表示显示最后4行
#tail -n4 -f access.log
-f参数,可以让tail程序不退出,并且实时地显示新增加的行
4,显示文件头
与tail类似,head命令用于显示文件头的一组行
#head -n4 access.log
-n参数跟上数字表示显示文件前面几行,这里的4表示显示开头4行
5,内容排序
如number.txt文件是一行行数字,使用#cat -n number.txt查出来的结果是2,3,5,1,4,而使用
#sort -n number.txt
-n参数会按照顺序进行排列为1,2,3,4,5
-r参数会按照逆序排列
#sort -n -r number.txt
则输出结果为5,4,3,2,1
#sort -k 2 -t ” -n number.txt
-k参数来指定排序的列,此处传2表示第二列,-t参数表示指定列的分隔符,这里是空格;-n表示按照数字顺序进行排列
6,字符统计
wc命令可以用来统计指定文件中的字符数,字数,行数,并输出统计结果:
#wc -l access.log
-l参数来统计文件中的行数
-c参数能够显示文件的字节数
-L参数查看最长的行的长度
-w参数查看文件中包含多少个单词
7,查看重复出现的行
uniq命令可以用来显示文件中行重复的次数,或者显示仅出现一次的行,以及仅仅显示重复出现的行;并且uniq的去重针对的只是连续的行,因此它常与sort结合起来使用
#sort uniqfile | uniq -c
-c参数用来在每一行最前面加上改行出现的次数
#sort uniqfile | uniq -c -u
-u参数只显示出现一次的行
#sort uniqfile | uniq -c -d
-d参数只会显示重复出现的行
8,字符串查找
grep命令可以查找文件中符合条件的字符串,如果发现文件内容符合指定查找串的行,会将改行打印出来。
#grep qq access.log
-c参数可以显示查找到的行数
#grep -c qq access.log
grep支持正则表达式,比如查找G开头和T结尾的字符串:
#grep ‘G.*T’ access.log
9,文件查找
常常需要修改一个文件,只知道文件名称,而不知道其路径,使用find命令
#find /home/data -name access.log
查找txt后缀的文件:
#find /home/data -name ‘*.txt’
递归打印当前目录所有文件:
#find . -print
whereis命令能够方便地定位到文件系统中可执行文件的位置:
#whereis run.sh
10,表达式求值
expr命令计算加减乘除表达式的值,查找字符串索引位置,计算字符串的长度;
#expr 10 \* 3
30 //结果,\*防止shell误会
#expr 10 % 3
1
#expr 10 + 10
20
#expr index “www.qq.com” qq
5
#expr length “this is a test”
14
11,归档文件
可以使用tar命令来生成归档文件,以及将归档文件展开。
#tar -cf aa.tar detach tmp
将detach,tmp目录打包成aa.tar
-c参数表示生成新文件,-f参数表示指定包的名称
#tar -tf aa.tar
-t参数表示列出包中文件的名称
#tar -xf aa.tar
-x参数则能够对打好的包进行解压
12,URL访问工具
要想在命令行下通过HTTP协议访问网页文档,就不得不用到curl工具,它支持HTTP, HTTPS, FTP, Telnet等多种协议,常被用来在命令行下抓取网页和监控Web服务器状态。
#curl www.google.com
发起网页请求
#curl -i www.google.com
-i参数,返回带header的文档
#curl -I www.google.com
-I参数,只返回带header的文档
13,查看请求访问量
对于在线运行的系统来说,常常会碰到恶意攻击行为,比较常见的是HTTP Flood,也成为CC,如何快速地定位到攻击,并迅速响应,便成为开发运维人员必备的技能。定位问题最快捷的办法就是登录到响应的应用查看访问日志,找到响应的攻击来源,如:
页面访问量前十的IP地址
#cat access.log | cut -f4 -d ” ” | sort | uniq -c | sort -k l -n -r | head -10
页面访问量排名前十的URL:
#cat access.log | cut -f4 -d ” ” | sort | uniq -c | sort -k l -n -r | head -10
其中cut过滤日志指定列,-d后表示以空格分隔
14,查看最耗时的页面
#cat access.log | sort -k 2 -n -r | head -10
15,统计404请求的占比
如果404请求占比过多,要么就是有恶意攻击者在进行扫描,要么就是系统出问题了,同样对于500的请求也是:
#export total_line=`wc -l access.log | cut -f1 -d ” “`&&`export not_found_line=`awk ‘$6==’404′{print $6}’ access.log | wc -l` && expr $not_found_line \* 100 / $ $total_line
==日志分析脚本==
常用的文本处理工具,sed和awk
1,sed编辑器
#sed ‘s/xxx/yahoo’ access.log | head -10
将日志中前十行xxx替换成yahoo输出
#sed -n ‘2,6p’ access.log
-n参数表示只输出指定的行,而’2,6p’表示选择的是第二行和第六行之间的行
#sed ‘/qq/d’ access.log
d参数执行的是文本删除命令,将包含qq的行删除
#sed ‘=’ access.log
=命令用来显示文件行号
#sed -e ‘i\start’ access.log | head -10
#sed -e ‘a\end’ access.log | head -10
i命令表示在行首插入内容,i\start命令表示在每行的前面插入start字符串
a命令表示在行尾追加内容,a\end命令表示在每行的末尾追加end字符串
#sed -e ‘/google/c\hello’ access.log | head -10
c命令表示对文本进行替换操作,查找/google/匹配的行,用hello对匹配的行进行替换
多个命令合起来使用,使用分号分割:
#sed -n ‘1,5p;1,5=’ access.log
上面是两条命令,第一个是打印出第一行到第五行,第二条将第一行到第五行的行号打印出来
如果编辑命令较为复杂,也支持将命令定义在文件中,如下列命令,将xxx替换成ttb,然后打印一到六行,并且输出行号
s/xxx/ttb/
1,6p
1,6=
将这些内容放在文件tested文件中,通过-f参数来指定文件,执行命令:
#sed -n -f tested access.log
2,awk程序
awk类似于一个编程的开放环境,让你能够自定义处理的规则,修改和重新组织文件中的内容。
#awk ‘{print $1}’ access.log
print命令用来格式化输出,支持转义符,$1表示第一列
#awk ‘/google/{print $5,$6}’ access.log
使用/google/查找包含google的行,并且打印第五,六列
#awk ‘length($0>40){print $3}’ access.log
查找length大于40的行,并且打印改行的第三列
#awk ‘{line = sprintf(“method:%s, response:%s”, $3, $7); print line}’ access.log | head -10
定义一个line变量,用于接受sprintf的输出,而sprintf用于格式化输出第三行的请求方式和第七行的响应时间。
awk支持编程方式来处理文本,如果程序较为复杂,可以将文本处理程序定义在文件中,通过-f选项来指定包含文本处理程序的脚本文件,如将前面执行的格式化输出命令放在testawk文件中:
#awk -f testawk access.log | head -10
awk脚本编程略
3,shell脚本
脚本能够更加方便地使用外部工具和命令,将内容输出到各个通道甚至是数据库,处理和调度各种复杂的任务等