当前位置: 首页 > Linux

性能工具之Linux常用日志统计分析命令

时间:2023-04-06 01:34:22 Linux

介绍前几天写的:Linux三剑客awk、grep、sed详解,我们已经详细介绍了Linux三剑客的基本使用,接下来看详细内容在性能测试领域,本文主要介绍Tomcat和Nginx访问日志的统计分析。tomcat统计请求响应时间server.xml使用配置方式,%D-请求时间,%F响应时间字段说明如下:%h-发起请求的客户端IP地址。这里记录的IP地址不一定是真实用户客户端的IP地址,可能是私网客户端的公网映射地址或代理服务器地址。%l-客户端的RFC1413ID(参考),只有实现RFC1413规范的客户端才能提供此信息。%u-远程客户端用户名,用于记录查看者在认证时提供的名称,如登录百度的用户名zuozewei,如果没有登录则为空。%t-收到请求的时间(访问时间和时区,如18/Jul/2018:17:00:01+0800,时间信息末尾的“+0800”表示时区服务器的是UTC后8小时)%{X-Real_IP}i-客户端的真实ip%r-来自客户端的请求行(请求URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到了什么样的请求)%>s-服务器返回给客户端的状态码,比如200表示成功。%b-发送给客户端的文件体内容的大小,不包括响应头的大小(你可以在日志中的每条记录中将这个值相加以获得服务器吞吐量的粗略估计)%D-时间处理请求,单位毫秒Unit%F-客户端浏览器提交响应的时间,单位毫秒。日志示例:47.203.89.212--[19/Apr/2017:03:06:53+0000]"GET/HTTP/1.1"200105995049Nginx统计请求和后台服务响应时间使用默认组合经典格式扩展response_time&upstream_response_timenginx.conf使用配置方法:log_formatmain'$remote_addr-$remote_user[$time_local]"$request"$status$body_bytes_sent$request_time$upstream_response_time"$http_referer""$http_user_agent""$http_x_forwarded_for"';字段说明如下:$remote_addr-发起请求的客户端IP地址。这里记录的IP地址不一定是真实用户客户端的IP地址,可能是私网客户端的公网映射地址或代理服务器地址。$remote_user-远程客户端用户名,用于记录查看者在认证时提供的名称,如登录百度的用户名zuozewei,如果未登录则为空。[$time_local]-收到请求的时间(访问时间和时区,如18/Jul/2018:17:00:01+0800,时间信息最后一个“+0800”表示时区服务器的是UTC小时后的8)"$request"-来自客户端的请求行(请求URI和HTTP协议,这是整个PVlogging中最有用的信息,记录服务器收到了什么样的请求)$status-状态服务器返回给客户端的代码,比如成功就是200。$body_bytes_sent-发送给客户端的文件体内容的大小,不包括响应头的大小(你可以在每条日志记录中将这个值相加,粗略估计服务器吞吐量)$request_time-整个请求的总时间,以秒为单位(包括接收到客户端请求数据的时间、后端程序响应的时间、向客户端发送响应数据的时间(不包括写日志的时间))$upstream_response_time-上游响应时间请求过程,以秒为单位(从与后端建立连接到接受数据再关闭连接的时间)"$http_referer"-记录来自哪个页面的链接(请求头Referer的内容)"$http_user_agent"-客户端浏览器信息(请求头User-Agent的内容)"$http_x_forwarded_for"-客户端的真实ip,通常web服务器放在反向代理后面,这样就无法获取到客户端的IP地址,而IP通过$remote_add得到的地址被反向为代理服务器的IP地址。反向代理服务器可以在转发请求的http头信息中添加x_forwarded_for**信息,记录原客户端的IP地址和原客户端请求的服务器地址。示例日志:218.56.42.148--[19/Apr/2017:01:58:04+0000]"GET/HTTP/1.1"20000.023-"-""Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/57.0.2987.133Safari/537.36""-"AWKApplication为了理解AWK程序,我们在下面简单介绍一下它的基本知识,具体可以参考上文。一个AWK程序可以由一行或多行文本组成,其核心是模式和动作的组合。pattern{action}模式(pattern)用于匹配输入中的每一行文本。对于匹配的每一行文本,awk执行相应的动作(action)。模式和动作由大括号分隔。awk按顺序扫描每一行文本,并使用记录分隔符(通常是换行符)将每一行读取为一条记录,并使用字段分隔符(通常是空格符或制表符)将一行文本分成多行领域。每个域可以分别用$1,$2,...$n表示。$1代表第一个字段,$2代表第二个字段,$n代表第n个字段。$0表示整个记录。无法指定模式或操作。默认情况下,将匹配所有行。在默认动作的情况下,将执行动作{print},即打印整条记录。这里以Nginxaccess.log为例,Tomcat同学自己举一反三。使用awk分解Nginx访问日志218.56.42.148--[19/Apr/2017:01:58:04+0000]"GET/HTTP/1.1"20000.023-"-""Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/57.0.2987.133Safari/537.36""-"$0为整条记录行$1为访问IP"218.56.42.148"$4为前半段请求时间"[19/Apr/2017:01:58:04"$5是请求时间的后半部分"+0000]"等等...当我们使用默认的域分隔符时,我们可以解析出以下不同类型的来自日志的信息:awk'{print$1}'access.logIP地址($remote_addr)awk'{print$3}'access.log用户名$remote_user)awk'{print$4,$5}'access.log日期和time([$time_local])awk'{print$7}'access_logURI($request)awk'{print$9}'access_log状态代码($status)awk'{print$10}'access_log响应大小($body_bytes_sent)awk'{print$11}'access_logrequesttime($request_time)awk'{print$12}'access_logupstreamresponsetime($upstream_response_time)不难发现不方便解析出请求行,参考页面和浏览器类型只能使用默认域分隔符和其他信息,因为这些信息包含不确定数量的空格。因此,我们需要将字段分隔符更改为",以便于阅读信息。awk-F\"'{print$2}'access.log请求行($request)awk-F\"'{print$4}'access.logreferrer($http_referer)awk-F\"'{print$6}'access.logbrowser($http_user_agent)awk-F\"'{print$8}'access.log真实ip($http_x_forwarded_for)注意:这里为了避免LinuxShell误认为"是字符串开头,我们使用了反斜杠,转义”。现在,我们对awk及其如何解析日志有了基本的了解。场景示例这里以Nginxaccess.log为例,Tomcat同学举一反三浏览器类型统计如果我们想知道网站访问过哪些浏览器类型,并按照出现次数倒序排序,我可以使用以下命令:awk-F\"'{print$6}'access.log|sort|uniq-c|sort-fr此命令行首先解析浏览器域,然后将输出作为第一个排序命令的输入通过管道传输。firstsort命令主要是为了方便uniq命令统计不同浏览器的出现次数,最后一个sort命令将之前的统计结果倒序排序输出,如果系统出现问题,我们可以使用如下命令行统计服务器代码返回的状态,查找系统可能存在的问题awk'{print$9}'access.log|sort|uniq-c|sort一般情况下,状态码200或30x应该是最常见。40x一般表示客户端访问问题。50x一般表示服务器端问题。以下是一些常见的状态码:200-请求已成功,请求所期望的响应头或数据体将与此响应一起返回。206-服务器已成功处理部分GET请求301-已拒绝请求的资源已永久移动到新位置302-请求的资源现在暂时响应来自不同URI的请求400-错误请求。服务器无法理解当前请求401-该请求未经授权,当前请求需要用户身份验证。403-Forbidden。服务器已理解该请求,但拒绝执行它。404-文件不存在,在服务器上找不到资源。500-服务器遇到意外情况,无法完成对请求的处理。503-由于临时服务器维护或过载,服务器当前无法处理请求。HTTP协议状态码的定义可以参考:https://www.w3.org/Protocols/...Statuscode-relatedstatisticsFindanddisplayallrequestswithstatuscode404awk'($9~/404/)'access.log统计所有状态码为404的请求awk'($9~/404/)'access.log|awk'{print$9,$7}'|sort现在我们假设一个请求(例如:URI:/path/to/notfound)产生了大量的404错误,我们可以通过以下命令找出这个请求来自哪个referrer页面和浏览器。awk-F\"'($2~"^GET/path/to/notfound"){print$4,$6}'access.log追踪谁在盗链网站图片有时会因为某些原因在其他网站找到他们的网站使用图片保存在他们的网站上。如果你想知道谁在未经授权的情况下使用他们网站上的图片,我们可以使用以下命令:awk-F\"'($2~/\.(jpg|gif|png)/&&$4!~/^http://www.example.com/)\{print$4}'access.log\|排序|uniq-c|sort注意:使用前,将www.example.com改为自己网站的域名。用“分隔每一行;请求行中必须包含“.jpg”、“.gif”或“.png”;引用页面不以您的网站域字符串开头(在本例中为www.example.com);显示所有引用的页面并计算出现的次数。IP相关统计不同IP访问了多少:awk'{print$1}'access.log|sort|uniq|wc–l统计每个IP访问了多少页:awk'{++S[$1]}END{for(ainS)printa,S[a]}'log_file将每个IP访问的页数从小到大排序:awk'{++S[$1]}END{for(ainS)printS[a],a}'日志文件|sort-n统计2018年8月31日14:00有多少IP访问:awk'{print$4,$1}'access.log|grep2018年8月31日:14|awk'{print$2}'|排序|独特|wc-l统计访问次数最多的前10个IP地址awk'{print$1}'access.log|sort|uniq-c|sort-nr|head-10columns找出某个IP访问了哪些页面:grep^202.106。19.100访问日志|awk'{print$1,$7}'统计某个IP的详细访问次数,按访问频率排序grep'202.106.19.100'access.log|awk'{print$7}'|sort|uniq-c|sort-rn|head-n100responsepagesizerelatedstatistics列出传输大小最大的几个文件cataccess.log|awk'{print$10""$1""$4""$7}'|sort-nr|head-100列出页面其输出大于204800字节(200kb)及对应页面出现次数cataccess.log|awk'($10>200000){print$7}'|sort-n|uniq-c|sort-nr|head-100列出最常访问的页面(TOP100)awk'{print$7}'access.log|排序|uniq-c|排序-rn|head-n100列出最常访问的页面([排除php页面](TOP100)grep-v".php"访问日志|awk'{print$7}'|排序|uniq-c|排序-rn|head-n100列出访问次数超过100的页面cataccess.log|切-d''-f7|排序|uniq-c|awk'{if($1>100)打印$0}'|less列出最近1000条记录,访问次数最多的页面tail-1000access.log|awk'{print$7}'|sort|uniq-c|sort-nr|lessPV相关统计和每分钟请求数统计,top100时间点(精确到分钟)awk'{print$4}'access.log|cut-c14-18|sort|uniq-c|sort-nr|head-n100统计每小时的请求数,top100的时间点(精确到小时)awk'{print$4}'access.log|cut-c14-15|sort|uniq-c|sort-nr|head-n100统计每秒请求数,top100个时间点(精确到秒)awk'{print$4}'access.log|cut-c14-21|sort|uniq-c|sort-nr|head-n100计算当天的pvgrep"10/May/2018"access.log|wc-l描述:awk'{print$4}':获取数据排序的第四个字段(第4列):sortuniq-c:打印每个重复行的出现次数。(并去除重复行)sort-nr:以出现重复行的相反顺序排列。head-n100:获取前100个IP页面的响应时间相关统计可以使用以下命令统计所有响应时间超过3秒的日志记录。awk'($NF>1){print$11}'access.log注意:NF是当前记录的字段数。$NF是最后一个字段。列出php页面请求时间超过3秒的页面,并统计出现次数,并显示前100个cataccess.log|awk'($NF>1&&$7~/.php/){print$7}'|sort-n|uniq-c|sort-nr|head-100列出响应时间超过5秒的请求,显示前20个awk'($NF>1){print$11}'access.log|awk-F\"'{print$2}'|sort-n|uniq-c|sort-nr|head-20spidercrawlstatistics统计蜘蛛爬行次数grep'Baiduspider'access.log|wc-l统计蜘蛛爬行404次grep'Baiduspider'access.log|grep'404'|wc-l小结通过本文的介绍,相信同学们会发现Linux三剑客的威力,在命令行中也可以接受并执行外部AWK程序文件支持非常复杂的文本信息处理,可以说“只有想不到的,没有做不到的”。