在分析服务器运行情况和业务数据时,nginx日志是非常可靠的数据来源,而掌握常用的nginx日志分析命令的应用技巧则有着事半功倍的作用,可以快速进行定位和统计。
1)Nginx日志的标准格式(可参考:http://www.cnblogs.com/kevingrace/p/5893499.html)
|
1
2
3
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time';
|
记录的形式如下:
|
1
2
|
192.168.28.22 - - [28/Feb/2018:04:01:11 +0800] "GET /UserRecommend.php HTTP/1.1"200 870 "http://wwww.kevin.www/grace/index.html"
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)"320
|
日志格式说明:
$remote_addr 远程请求使用的IP地址
$remote_user 远端登录名
$time_local 时间,用普通日志时间格式(标准英语格式)
$request 请求的第一行
$status 状态。
$body_bytes_sent 请求返回的字节数,包括请求头的数据
$http_referer 请求头Referer的内容
$http_user_agent 请求头User-Agent的内容
$request_time 处理完请求所花时间,以秒为单位
==============================================================
Apache日志的标准格式
|
1
2
|
LogFormat "%h %l %u %t /"%r/" %>s %b /"%{Referer}i/" /"%{User-Agent}i/" %T "combined
CustomLog log/access_logcombined
|
记录的形式如下:
|
1
2
|
192.168.28.23 - frank [28/Feb/2018:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0"200 2326 "http://www.example.com/start.html"
"Mozilla/4.08 [en] (Win98; I ;Nav)"
|
日志格式说明:
%h 请求使用的IP地址
%l 远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为"On",否则将得到一个"-"。
%u 远程用户名(根据验证信息而来;如果返回status(%s)为401,可能是假的)
%t 时间,用普通日志时间格式(标准英语格式)
%r 请求的第一行
%s 状态。对于内部重定向的请求,这个状态指的是原始请求的状态,---%>s则指的是最后请求的状态。
%b 以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示'-'而不是0。
/"%{Referer}i/" 发送到服务器的请求头Referer的内容。
/"%{User-Agent}i/" 发送到服务器的请求头User-Agent的内容。
%T 处理完请求所花时间,以秒为单位。
%I 接收的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。
%O 发送的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。
=======================================================
2)Nginx日志切割
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#!/bin/sh
# 设置日志文件备份文件名
#logfilename=`date +%Y%m%d`
logfilename=`date+/%Y/%m/%d -d "1 days ago"`
# 设置日志文件原始路径
logfilepath=/opt/nginx/logs/
# 设置日志备份文件路径
backupfilepath=/opt/data/logs/nginx/
LOG_FILE='access error log_mm log_db'
forj in$LOG_FILE
do
cd${logfilepath}
tarzcvf ${backupfilepath}$j/${logfilename}.tar.gz $j.log
rm-rf $j.log
done
kill-USR1 `cat /opt/nginx/nginx.pid
|
===================================================
apache日志切割
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#!/bin/bash
# 获取昨天的日期
logfilename=`date-d yesterday +%Y_%m_%d`
today=`date+%Y.%m.%d`
# 设置日志文件原始路径
logfilepath=/opt/apache2/logs/
# 设置日志备份文件路径
backupfilepath=/opt/data/logs/apache/
echo"get access log:"
# 打包压缩访问日志文件
cd${logfilepath}
tarzcvf ${backupfilepath}access/${logfilename}.tar.gz access_${logfilename}.log
rm-rf access_${logfilename}.log
echo"get error log:"
# 打包压缩错误日志文件
cd${logfilepath}
tarzcvf ${backupfilepath}error/${logfilename}.tar.gz error_${logfilename}.log
rm-rf error_${logfilename}.log
echo"done @"${today}
|
==========================================================
3)日志定时清理的脚本
|
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
|
#!/bin/sh
####################### clear logs #########################
### nginx ###
#clear nginx access log(by hour .log) 2 days ago
/usr/bin/find/opt/data/logs/nginx/access-mtime +2 -name "access.log*"-execrm-rf {} /;
#clear nginx (access,error,log_mm,log_db) log(by day tar.gz) 10 days ago
NGINX='access error log_mm log_db'
fori in$NGINX
do
/usr/bin/find/opt/data/logs/nginx/$i -mtime +10 -name "*tar.gz"-execrm-rf {} /;
done
### apache ###
#clear apache (access,error) log(by day tar.gz) 10 days ago
APACHE='access error'
forj in$APACHE
do
/usr/bin/find/opt/data/logs/apache/$j -mtime +10 -name "*tar.gz"-execrm-rf {} /;
done
### other log ###
#clear (txt/mq,txt/auto,txt/man) log(by day .log) 10 days ago
OTHER='txt/mq txt/auto txt/man'
fork in$OTHER
do
/usr/bin/find/opt/data/logs/$k -mtime +10 -name "*log"-execrm-rf {} /;
done
|
=============在分析nginx日志时常用命令总结=============
1. 利用grep ,wc命令统计某个请求或字符串出现的次数
|
1
2
3
4
5
6
|
2. 统计所有接口的调用次数并显示出现次数最多的前二十的URL
3. 统计报错的接口
|
1
2
3
4
5
|
统计nginx日志中报错较多的接口,对于分析服务器的运行情况很有帮助,也可以有针对性的修复bug和性能优化。
awk'{split($7,b,"?");COUNT[b[1]]++;}END{for(a in COUNT) print COUNT[a], a}'|sort-k 1 -nr|head-n10
先用awk’{if(9==500)print0}’过滤出500错误的日志,然后在此基础上做统计,其思路同2类似!
|
4. 统计HTTP响应状态码
5. 统计服务器并发量
|
1
2
3
4
5
|
6. grep多条件与或操作
|
1
2
3
4
5
6
7
8
|
有时候我们需要在nginx日志通过多个条件来查找某些特定请求,比如我需要找个某个用户浏览文章的请求,则可以需要同时匹配两个条件:
浏览文章接口GET /app/kevinContent和userId=59h7hrrn。
grep对应的与操作命令如下:
grep与命令格式: grep-E “a.*b” file,ab条件同时成立
而grep或命令的格式为:grep-E “a|b” file,ab两个条件有一个成立即可。
|
7. grep打印匹配的前后几行
|
1
2
3
4
5
6
7
8
9
10
11
|
有时候我们需要查找某个特定请求的前后几行的请求,以观察用户的关联操作情况。grep提供了一下几条命令:
# grep -C 5 'parttern' inputfile //打印匹配行的前后5行。
# grep -A 5 'parttern' inputfile //打印匹配行的后5行
# grep -B 5 'parttern' inputfile //打印匹配行的前5行
grep-An 或grep-A n
grep-Bn 或grep-B n
grep-Cn 或grep-C n
如下,打印出access.log日志文件中匹配/app/kevinContent关键字符所在行的前后各10行
|
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/1955.html