日志统计常用技巧

日志统计常用技巧

按时间截取

截取指定时间段日志

1
sed -n '/^2018-10-29 14:30/,/^2018-10-29 14:32/p' server.log | more

按标识截取

截取特定标识日志的内容(仅特定标识日志行、或标识附近日志行)
过滤包含特定标识(忽略大小写)的日志、并显示前后 10 行

1
2
3
4
5
grep -i -A 10 -B 10 "error" access.log | more
grep -i -A 10 -B 10 "error" access.log > access_error.txt

grep -i -C 10 "error" access.log | more
grep -i -C 10 "error" access.log > access_error.txt

按指定列截取

截取第7列为 ‘/test’ 的行

1
cat access.log | awk 'if($7=="/test"{print $0}' | more

日志统计

分时访问量统计
对日志中的时间列进行拆分,根据时间格式取 YYYY-mm-DD HH:MM 部分、进行排序、汇总,即可获得每分钟的访问量统计。

按分钟汇总统计访问量

1
cat access.log | grep "^2012-" | awk -F\: '{print $1" "$2":"$3}' | sort | uniq -c | more

按小时汇总统计访问量

1
cat access.log | grep "^2012-" | awk -F\: '{print $1" "$2"}' | sort | uniq -c | more

日志中的 IP 地址

Web服务器日志(Nginx)中,通常第一列为客户端IP地址,取该段值进行排序、汇总,即可得到IP:访问次数的统计。

从日志中统计 IP 访问次数

1
cat access.log | awk '{print $1}' | sort | uniq -c | more

统计来访唯一 IP 数

1
cat access.log | awk '{print $1}' | sort | uniq | wc -l

网络连接状态

netstat 命令可获取系统当前的侦听、连接状态,包括协议、源IP:端口、目标IP:端口、连接状态信息,取关注的列进行排序、汇总,即可获得连接数、状态等统计。

TCP连接数

1
2
3
4
5
6
7
netstat -antp | grep ^tcp | awk '{print $5}' | awk -F\: '{print $1}' | sort | uniq -c | sort -nr
5 0.0.0.0
2 192.217.199.215
1 91.189.89.144
1 172.16.17.4
1 172.16.17.3
1 172.16.17.27

TCP 连接状态

1
2
3
4
netstat -antp | grep ^tcp | awk '{print $6}' | sort | uniq -c | sort -nr 
17 ESTABLISHED
8 LISTEN
1 CLOSE_WAIT

使用 awk 的正则匹配进行过滤,减少前面的 grep 指令
不过 grep 的过滤处理速度似乎比 awk 的正则匹配速度更快,因此对大日志分析时可能还是先用 grep 过滤效率更高

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
time cat netstat.txt | awk '/^tcp/ {print $6}' | sort | uniq -c | sort -nr
2713 TIME_WAIT
203 ESTABLISHED
29 FIN_WAIT1
18 LISTEN
17 FIN_WAIT2

real 0m0.017s
user 0m0.014s
sys 0m0.002s

time cat netstat.txt | grep ^tcp | awk '{print $6}' | sort | uniq -c | sort -nr
2713 TIME_WAIT
203 ESTABLISHED
29 FIN_WAIT1
18 LISTEN
17 FIN_WAIT2

real 0m0.008s
user 0m0.005s
sys 0m0.001s

其他 awk 匹配方式

1
2
3
4
5
6
7
8
9
10
11
12
13
cat netstat.txt | awk '{if($1=="tcp")print $6}' | sort | uniq -c | sort -nr
2713 TIME_WAIT
203 ESTABLISHED
29 FIN_WAIT1
18 LISTEN
17 FIN_WAIT2

cat netstat.txt | awk '$1=="tcp" {print $6}' | sort | uniq -c | sort -nr
2713 TIME_WAIT
203 ESTABLISHED
29 FIN_WAIT1
18 LISTEN
17 FIN_WAIT2

多条件匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
cat netstat.txt | awk '/^tcp|^udp/ {print $1"-"$6}' | sort | uniq -c | sort -nr
2713 tcp-TIME_WAIT
203 tcp-ESTABLISHED
29 tcp-FIN_WAIT1
18 tcp-LISTEN
17 tcp-FIN_WAIT2
4 udp-32366/rpcbind
4 udp--
3 udp-32526/rpc.statd
2 udp-19339/rpc.mountd
1 udp-ESTABLISHED
1 udp-38143/gmond
1 udp-19335/rpc.rquotad
1 udp-1282/portreserve

cat netstat.txt | awk '{if($1~"^tcp" || $1~"^udp")print $1"-"$6}' | sort | uniq -c | sort -nr
2713 tcp-TIME_WAIT
203 tcp-ESTABLISHED
29 tcp-FIN_WAIT1
18 tcp-LISTEN
17 tcp-FIN_WAIT2
4 udp-32366/rpcbind
4 udp--
3 udp-32526/rpc.statd
2 udp-19339/rpc.mountd
1 udp-ESTABLISHED
1 udp-38143/gmond
1 udp-19335/rpc.rquotad
1 udp-1282/portreserve

cat netstat.txt | awk '{if($1=="tcp" && $6!~"ESTABLISHED")print $6}' | sort | uniq -c | sort -nr
2713 TIME_WAIT
29 FIN_WAIT1
18 LISTEN
17 FIN_WAIT2

示例

示例一

扫描 gz 压缩文件,从中寻找带有 dianping_reply 的行,将改行按照[进行拆分,然后直接使用if条件进行判断,比较,最终输出想要的结果。

1
zcat access.log.tar.gz | grep 'dianping_reply.log' | awk '{split($4,array,"[");if(array[2]>="29/May/2016:00:00:26" && array[2]<="29/May/2016:00:01:14"){print $0}}'

命令解释
zcat 直接读取压缩文件的内容
grep 过滤特定字符的行
awk 用于执行命令
split 用于切分字符串

示例二

过滤 22/Feb/2017-18:52:59 之前的日志

1
2
3
4
5
6
7
8
9
test.log
[22/Feb/2017-18:51:58] api.momo.com /api/feed HTTP/1.1 121.0.0.1 android1.2
[22/Feb/2017-18:51:59] api.momo.com /api/follow HTTP/1.1 121.0.0.2 iphone1.1
[22/Feb/2017-18:52:58] api.momo.com /api/user HTTP/1.1 121.0.0.3 iphone1.1
[22/Feb/2017-18:52:41] api.momo.com /api/feed HTTP/1.1 121.0.0.4 android1.2
[22/Feb/2017-18:56:30] api.momo.com /api/follow HTTP/1.1 121.0.0.2 android1.2
[22/Feb/2017-18:51:21] api.momo.com /api/user HTTP/1.1 121.0.0.3 iphone1.1
[22/Feb/2017-18:59:58] api.momo.com /api/user HTTP/1.1 121.0.0.3 android1.2
[22/Feb/2017-18:51:21] api.momo.com /api/feed HTTP/1.1 121.0.0.1 iphone1.1
1
cat test.log | awk '{split($1,array,"[");split(array[2],array2,"]");if(array2[1] >= "22/Feb/2017-18:52:59"){print($0)}}'

参考文档

http://xstarcd.github.io/wiki/shell/logview_tips.html

---------------- The End ----------------
0%