nginx日志相关运维操作记录
在分析服务器运行情况和业务数据时,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_log combined | 
记录的形式如下:
| 
 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' for j in $LOG_FILE do         cd ${logfilepath}         tar zcvf ${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} tar zcvf ${backupfilepath}access/${logfilename}.tar.gz access_${logfilename}.log rm -rf access_${logfilename}.log    echo "get error log:" # 打包压缩错误日志文件 cd ${logfilepath} tar zcvf ${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*" -exec rm -rf {} \;    #clear nginx (access,error,log_mm,log_db) log(by day tar.gz) 10 days ago NGINX='access error log_mm log_db' for i in $NGINX do         /usr/bin/find /opt/data/logs/nginx/$i -mtime +10 -name "*tar.gz" -exec rm -rf {} \; done    ### apache ###  #clear apache (access,error) log(by day tar.gz) 10 days ago APACHE='access error' for j in $APACHE do         /usr/bin/find /opt/data/logs/apache/$j -mtime +10 -name "*tar.gz" -exec rm -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' for k in $OTHER do         /usr/bin/find /opt/data/logs/$k -mtime +10 -name "*log" -exec rm -rf {} \; done | 
=============在分析nginx日志时常用命令总结=============
1. 利用grep ,wc命令统计某个请求或字符串出现的次数
| 
 1 
2 
3 
4 
5 
6 
 | 
比如统计GET /app/kevinContent接口在某天的调用次数,则可以使用如下命令:[root@Fastdfs_storage_s1 ~]# cat /usr/local/nginx/logs/access.log | grep 'GET /app/kevinContent' | wc -l其中cat用来读取日志内容,grep进行匹配的文本搜索,wc则进行最终的统计。当然只用grep也能实现上述功能:[root@Fastdfs_storage_s1 ~]# grep 'GET /app/kevinContent'  /usr/local/nginx/logs/access.log -c | 
2. 统计所有接口的调用次数并显示出现次数最多的前二十的URL
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
 | 
[root@Fastdfs_storage_s1 ~]# cat /usr/local/nginx/logs/access.log|awk '{split($7,b,"?");COUNT[b[1]]++;}END{for(a in COUNT) print  COUNT[a], a}'|sort -k1 -nr|head -n202722 /10 /group1/M00/00/00/wKgKylqT3OCAUrqYAAAwK2jUNaY262.png9 /group1/M00/00/00/wKgKylqUxBOAFo8hAAKHUIZ3K9s443.jpg6 /group1/M00/00/00/wKgKylqUrceAGkPOAAAwK2jUNaY843.png4 /group1/M00/00/00/wKgKylqTsFCAdeEuAAKHUIZ3K9s287.png3 /group2/M00/00/00/wKgKy1qUtu2Acai1AAKHUIZ3K9s555.jpg2 /favicon.ico1 /group2/M00/00/00/wKgKy1qT3P-Ae-vQAAKHUIZ3K9s459.png1 /group2/M00/00/00/wKgKy1qT3P-Ae-vQAAKHUIZ3K9s459.jpg1 /group1/M00/00/00/wKgKylqUyMuAdkLwAAAwK2jUNaY176.png1 /group1/M00/00/00/wKgKylqUtuyAA5xrAAKHUIZ3K9s226.jpg1 /group1/M00/00/00/wKgKylqUscKAa4NXAAKHUIZ3K9s530.jpg1 /group1/M00/00/00/wKgKylqTsFCAdeEuAAKHUIZ3K9s287.jpg1 /group1/M00/00/00/wKgKylqT4ESAHdNjAAKHUIZ3K9s730.jpg1 /group1/M00/00/00/wKgKylqT3-6AbEeUAAKHUIZ3K9s742.png解释说明:这里awk是按照空格把每一行日志拆分成若干项,其中$7对应的就是URL,当然具体对应的内容和使用nginx时设置的日志格式有关。这样就可以通过拆分提取出IP,URL,状态码等信息。split是awk的内置函数,在此的意思是按照“?”将URL进行分割得到一个数组,并赋值给b。COUNT[b[1]]++表示相同的接口数目加1。sort用来排序,-k1nr表示要把进行排序的第一列作为数字看待,并且结果倒序排列。head -n20意为取排名前二十的结果。 | 
3. 统计报错的接口
| 
 1 
2 
3 
4 
5 
 | 
统计nginx日志中报错较多的接口,对于分析服务器的运行情况很有帮助,也可以有针对性的修复bug和性能优化。[root@Fastdfs_storage_s1 ~]# cat /usr/local/nginx/logs/access.log|awk '{if($9==500) print $0}'|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响应状态码
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
 | 
通过统计响应状态码可以看出服务器的响应情况,比如499较多时可以判断出服务器响应缓慢,再结合3可以找出响应慢的接口,这样就能有针对性进行性能分析和优化。[root@Fastdfs_storage_s1 ~]# cat /usr/local/nginx/logs/access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}'| sort -k 2 -nr200 2733304 20404 11 | 
5. 统计服务器并发量
| 
 1 
2 
3 
4 
5 
 | 
[root@Fastdfs_storage_s1 ~]# cat /usr/local/nginx/logs/access.log |grep '10.15.19.138'| awk '{COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}'|sort -k 2 -nr|head -n20nginx转发请求时可以记录响应请求的服务器IP,先通过grep过滤出某个服务器所有的请求,然后统计各个时间点的并发请求响应的数量即可得到某个服务器的并发量。$4对应的是响应时间。当然,如果把grep的内容更换成某个接口也就可以统计出该接口对应的并发量了。 | 
6. grep多条件与或操作
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
有时候我们需要在nginx日志通过多个条件来查找某些特定请求,比如我需要找个某个用户浏览文章的请求,则可以需要同时匹配两个条件:浏览文章接口GET /app/kevinContent和userId=59h7hrrn。grep对应的与操作命令如下:[root@Fastdfs_storage_s1 ~]# grep -E "GET /app/kevinContent.*userId=59h7hrrn" /usr/local/nginx/logs/access.loggrep与命令格式: 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 ngrep -Bn  或grep -B ngrep -Cn  或grep -C n如下,打印出access.log日志文件中匹配/app/kevinContent关键字符所在行的前后各10行[root@Fastdfs_storage_s1 ~]# grep -C 10 'GET /app/kevinContent' /usr/local/nginx/logs/access.log | 
nginx日志相关运维操作记录的更多相关文章
- 针对Nginx日志的相关运维操作记录
		
在分析服务器运行情况和业务数据时,nginx日志是非常可靠的数据来源,而掌握常用的nginx日志分析命令的应用技巧则有着事半功倍的作用,可以快速进行定位和统计. 1)Nginx日志的标准格式(可参考: ...
 - Redis 相关运维操作
		
背景 Redis作为目前全球最流行的KV存储,除了使用之外,还需要做好日常的运维工作.关于运维相关的工作,本文从以下方面进行介绍说明(Redis5.0以上): 内存方面 客户端连接方面 工具方面 说明 ...
 - MongoDB副本集(一主一备+仲裁)环境部署-运维操作记录
		
MongoDB复制集是一个带有故障转移的主从集群.是从现有的主从模式演变而来,增加了自动故障转移和节点成员自动恢复.MongoDB复制集模式中没有固定的主结点,在启动后,多个服务节点间将自动选举产生一 ...
 - Linux内存运维操作及常用命令
		
Linux内存运维操作及常用命令 1.问题诊断 1.1 什么是 Linux 服务器 Load Average? 1.2如何查看 Linux 服务器负载? 1.3服务器负载高怎么办? 1.4如何查看服务 ...
 - Linux  bash运维操作日志审计(单服务器)
		
目前公司有几台机器比较重要,需要把所有用户的操作记录下来,于是就是参照资料来完成 1. vim /etc/profile.d/oplogrc.sh logdir=/opt/oplog userdir= ...
 - IIS日志-网站运维的好帮手
		
对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情. 有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的. 还有些时候,我们希望不断地优化网站,让网站更快速的 ...
 - 【转】IIS日志-网站运维的好帮手
		
对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情. 有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的. 还有些时候,我们希望不断地优化网站,让网站更快速的 ...
 - 2015年br运维操作归档
		
归档2015年在br做运维时常用的命令,主要梳理出log的过滤操作. 对于日志文本的处理,常见还是sed和awk,具体如下: 统计ip访问量: cat nginx.log |awk '{print $ ...
 - WebLogic11g-常用运维操作
		
转:http://www.codeweblog.com/weblogic11g-%e5%b8%b8%e7%94%a8%e8%bf%90%e7%bb%b4%e6%93%8d%e4%bd%9c/ 希望这篇 ...
 
随机推荐
- JQuery 中$("input:eq(0)") eq 的意思
			
:eq(index)匹配一个给定索引值的元素 ----------------------------------------------------- Matches a single elemen ...
 - [最新]ABP ASP.NET Zero v5.5.2 破解
			
参考https://www.cnblogs.com/xajh/p/8428818.html后, 搞定了Abp.AspNetZeroCore.dll.Abp.AspNetZeroCore.Web.dll ...
 - [转]SQL中 OVER(PARTITION BY) 取上一条,下一条等
			
OVER(PARTITION BY)函数介绍 开窗函数 Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返 ...
 - iOS项目之iPhoneX遇到的坑
			
问题一: 今天升级到Xcode 9.0,里面多了iPhone 8,iPhone 8P,iPhone X三款手机模拟器,而且发现最多可以同时运行五个模拟器.但随之而来的问题也出现了,就是 iPhone ...
 - AES256对称加密
			
需要引入bouncycastle库的jar包 package test; import java.io.UnsupportedEncodingException; import java.securi ...
 - word模板导出的几种方式:第一种:占位符替换模板导出(只适用于word中含有表格形式的)
			
1.占位符替换模板导出(只适用于word中含有表格形式的): /// <summary> /// 使用替换模板进行到处word文件 /// </summary> public ...
 - oracle 锁表
			
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = ...
 - java中的构造器
			
构造器是什么 1.构造器,也称构造方法.构造函数.作用是构造出来一个类的实例,确保对象得到初始化. 2.构造器的格式: 权限修饰符 类名(无参/有参){}. 3.根据有无参数,可分为无参构造 和有参构 ...
 - Log4j2 设置控制台打印彩色日志
			
https://www.baidu.com/s?ie=utf-8&tn=02003390_20_hao_pg&wd=%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%99% ...
 - 【我的前端自学之路】【HTML5】Web Socket
			
以下为自学笔记内容,仅供参考. 转发请保留原文链接:https://www.cnblogs.com/it-dennis/p/10508118.html 什么是Web Socket WebSocket ...