大型分布式网站架构设计与实践——在线日志分析

通过日志分析的命令和脚本,筛选日志中有价值的内容,可以分析得出系统产生问题的原因。


一、日志分析常用命令

1、查看文件的内容
cat -n

2、分页显示文件
more
enter 显示文件下一行、空格键显示下一页、f键显示下一屏、b键显示上一屏

less 支持/查找


3、显示文件尾
tail -n -f

4、显示文件头
head -n

5、内容排序
sort -n数字排序 -r逆序 -t分隔符 -k 第几列
eg:
192.168.142.56 - - [09/Mar/2016:16:42:59 +0800] "POST /jdy-servlet/users HTTP/1.1" 200 11
按照响应时间排序: sort -n -t' ' -k10 fileName

6、字符统计
wc 可以统计指定文件中的字符数、字数、行数、并输出统计结果


7、查看重复出现的行
uniq
sort file | uniq -c 排序后去重

8、字符串查找
grep
grep -c qq file -c 显示查找到的行数
grep -c 'G.*T' file 正则式

9、文件查找
find
find ./ -name '*.txt'

find . -print 递归显示所有的文件

whereis startuo.sh 定位到文件系统中可执行文件的位置

10、表达式求值
expr
加减乘除 + - \* / %
字符串操作:
索引位置: expr index 'www.baidu.com' com
字符串长度: expr length 'www.baidu.com'

11、归档文件
tar -c 生成新的包 -f 命名 -z 压缩 -x解压
-zcv -zxf

12、URL访问工具
curl
支持HTTP、HTTPS、FTP、FTPS、 Telnet等协议;
提交表单、传递cookie信息、构造refer等操作


实例:
1、查看请求访问量
192.168.143.39 - - [09/Mar/2016:08:20:54 +0800] "POST /jdy-servlet/users HTTP/1.1" 200 596
ip访问量前三: cat access_log.txt | cut -f1 -d' ' | sort -n | uniq -c | sort -r -n -k1 -t' ' | head -n3
页面访问量前三: cat access_log.txt | cut -d' ' -f7 | sort | uniq -c | sort -n -r -k1 -t' ' | head -n3

2、查看最耗时的页面
cat access_log.txt | sort -n -r -t' ' -k10 | head -n20

3、统计404请求占比
export total_line=`wc -l access_log.txt |cut -f 1 -d ' '` && export not_found_line=`awk '{if($9=="404")print $6}' access_log.txt|wc -l` && echo $not_found_line / $total_line

 


二、日志分析脚本
1、sed:
流编辑器是在编辑数据之前,预先指定数据的编辑规则,然后按照规则将数据输出到标准输出;
在流编辑器的搜欧规则与输入的行匹配完毕以后,编辑器读取下一行,重复之前的规则;
处理完搜所有的数据后,流编辑器停止;
sed是面向行的,并且sed不会修改文件本身;


s 文本替换
将日志中的jdy替换成google输出
sed 's/jdy/google/' access_log.txt | head -10

-n 输出指定的行
筛选文件中指定的行输出
sed -n '2,6p' access_log.txt

d 文本删除
根据正则表达式删除文件中指定的行
sed '/jdy/d' access_log.txt

= 显示文件行号
显示文件行号
sed '=' access_log.txt

i 行首插入内容
在行首插入文本 head
sed -e 'i\head' access_log.txt | head -10

a 行末追加文本
在每一行的尾末追加ecd
sed -e 'a\end' access_log.txt | head -10

c 将匹配到的行进行替换
sed -e '/jdy/c\hello' access_log.txt | head -10


将jdy替换为google,然后打印第一行到第七行,并且输出行号
sed -n 's/jdy/google/;1,7p;1,6=' access_log.txt


2、awk
awk提供了类似于编程的开放环境,能够自定义文本处理的规则

打印文件指定的列:
awk '{print $1}' access_log.txt | head -10

筛选指定的行,并打印其中的一部分列:
awk '/jdy/{print $5, $6}' access_log.txt | head -10

查找length大于40的行,并且打印改行的第三列:
awk 'length($0)>40{print $3}' access_log.txt | head -10

输出第六行的请求方法和第十行的响应时间:
awk '{line = sprintf( "method:%s\", response:%s", $6, $10); print line}' access_log.txt |head -1

计算加总
$ cat count.txt | awk '{sum+=$1} END {print "Sum = ", sum}'
Sum = 15.9
计算平均值
$ cat count.txt | awk '{sum+=$1} END {print "Average = ", sum/NR}'


3、shell
(完善中…………)

posted @ 2016-03-17 15:43  _NullPointer  阅读(794)  评论(0编辑  收藏  举报