当前位置: 首页 > 科技观察

没想到日志竟然可以这样分析!

时间:2023-03-19 16:07:37 科技观察

本文转载自微信公众号“小林编码”,作者小林编码。转载本文请联系小林编码公众号。很多时候,我们观察程序是否按计划运行或者是否出错最直接的方式就是看运行日志。当然,如果我们想快速的从日志中找到我们想要的信息,前提是程序打印出来的日志要精炼、准确。但日志涵盖的信息远不止于此。比如nginx的access.log日志,我们可以根据日志信息分析用户行为。用户行为呢?比如分析哪个页面的访问量(PV)、访问量(UV)、哪一天的访问量最多、哪个请求的访问量最多等等。这次我们就以一个上万条记录的nginx日志文件为例,看看如何分析“用户信息”。不要急于开始。当我们要分析日志时,首先使用ls-lh命令查看日志文件的大小。如果日志文件体积很大,最好不要在在线环境下进行。比如下面的日志是6.5M,不算大,线上环境分析问题不大。如果日志文件的数据量太大,直接执行cat命令,会影响线上环境,增加服务器的负载。在严重的情况下,服务器可能没有响应。当我们发现日志很大时,可以使用scp命令将文件转移到空闲的服务器上做进一步分析。读多少就读多少,显然不适合大文件。对于大文件,我们应该养成一个好习惯,使用less命令读取文件内容,因为less不会加载整个文件,而是按需加载,先输出一小页内容,当你想往下看,加载会继续。可以发现nginx的access.log日志的每一行都是一条用户访问的记录,从左到右依次是:客户端的IP地址;访问时间;HTTP请求方式、路径、协议版本、协议版本、返回的Status码;UserAgent,一般是客户端使用的操作系统和版本,浏览器和版本;但是,有时候我们想看日志的最新部分,我们可以使用tail命令,比如当你想查看最后5行的内容时,可以使用这个命令:如果你想查看日志的内容日志实时打印,可以使用tail-f命令,这样在查看日志的时候,会阻塞,当有新的日志输出时,会实时显示。PV分析PV的全称是PageView。当用户访问一个页面时,它就是一个PV。比如在大多数博客平台上,一个页面一旦被点击,浏览量就会增加1。因此,PV数并不代表真实的用户数,只代表点击数。.nginx的acess.log日志文件,比较容易分析PV。由于日志的内容是访问记录,所以有多少条日志记录就有多少个PV。我们可以直接使用wc-l命令查看整体PV,如下图,一共有49903个PV。PV分组nginx的acess.log日志文件中有访问时间信息,所以我们可以根据访问时间进行分组,比如按天分组,查看每天的总PV,这样可以得到更直观的数据。要按时间分组,首先我们过滤掉“访问时间”,这里可以使用awk命令进行处理,awk是处理文本的强大工具。awk命令默认使用“空格”作为分隔符。由于访问时间在日志的第四列,可以使用awk'{print$4}'access.log命令过滤掉访问时间信息。结果如下:上面的信息还包括时分秒。如果只想显示年月日的信息,可以使用awk的substr函数截取从第二个字符开始的11个字符。然后,我们可以使用sort对日期进行排序,然后使用uniq-c进行统计,这样按天分组的PV就出来了。可以看出每天的PV量在2000-2800左右:注意在使用uniq-c命令之前,一定要先排序,因为uniq去重的原理是比较相邻的行,然后去掉第二个line和thisline,因此在使用uniq命令之前使用sort命令使所有重复行相邻。UV分析UV的全称是UniqVisitor,代表访客数。比如公众号的阅读量是通过UV统计的。无论单个用户点击多少次,都只算一次阅读。虽然access.log日志中没有用户身份信息,但我们可以通过“客户端IP地址”来近似统计UV。这条命令的输出是2589,也就是说UV的量是2589。上图中,命令从左到右的含义如下:awk'{print$1}'access.log,获取日志第一??列的内容,客户端的IP地址就是第一栏;排序,整理信息;uniq,去除重复记录;wc-l,查看记录数;UV分组假设我们分组分析每天的UV数量。这种情况稍微复杂一点,需要更多的命令来实现。由于要按天计算UV,因此必须过滤掉“日期+IP地址”并删除重复项。命令如下:具体分析如下:第一个ack是将第4列的日期和第1列的客户端IP地址过滤掉,用空格拼接在一起;然后sort对第一个ack输出的内容进行排序;然后用uniq去除重复记录,也就是只保留日期+IP相同的一行;以上只是UV数据列出来的,并没有统计次数。如果需要当天的UV统计,在上面的命令中加上awk'{uv[$1]++;next}END{for(ipinuv)printip,uv[ip]}'命令,结果如下图:awk本身是“逐行”处理的。当一行执行时,我们可以使用next关键字来告诉awk跳转到下一行,并将下一行作为输入。对于每一行输入,awk都会按照第一列(也就是日期)的字符串进行累加,这样同一天的ip地址就会累加为当天的uv个数。下面的END关键字代表一个触发器,即END{}中的语句会在前面的所有输入完成后执行。END语句是通过foreach遍历uv中的所有key,打印出按day分组的uv的个数。终端分析nginxaccess.log日志末尾的UserAgent的信息,主要是客户端访问服务器使用的工具,可能是手机,浏览器等。因此,我们可以使用此信息来分析哪些终端访问服务器。UserAgent的信息在日志的第12列,所以我们先用awk过滤掉第12列的内容,然后排序,然后用uniq-c去重统计,最后用sort-rn(r表示反向排序,n表示按值排序)对统计结果进行排序,结果如下图:在分析TOP3请求access.log日志中,第七列为客户端请求的路径,先用awk过滤掉第七列的内容,进行sort排序,然后用uniq-c去重统计,然后用sort-rn对统计结果进行排序,最后用head-n3分析TOP3请求,结果如下:原文链接:https://mp.weixin.qq.com/s/c1QXIeYR0zRrzTXWxFNxCw