Nginx挖掘access_log互联网公司运维平台案例统计

举报
小滴课堂 发表于 2022/03/30 14:35:21 2022/03/30
【摘要】 01日志的作用你知道有多重要吗?说到日志文件,我们肯定很熟悉,从我们一开始学代码的时候就要打印对应的日志方便找人排查问题。那有多少同学有真正去分析过对应的日志,以及这个日志里面可以挖掘出哪些信息?关于日志里面的金矿有很多很多,我这边举几个很常见的例子。例子一:很多公司的一个推荐系统都是根据日志进行构建用户画像,比如你看新闻他那边的相关推荐,或者你看抖音短视频,它里面的相关推荐都是根据用户的行...

01

日志的作用你知道有多重要吗?

说到日志文件,我们肯定很熟悉,从我们一开始学代码的时候就要打印对应的日志方便找人排查问题。


那有多少同学有真正去分析过对应的日志,以及这个日志里面可以挖掘出哪些信息?


关于日志里面的金矿有很多很多,我这边举几个很常见的例子。


例子一:很多公司的一个推荐系统都是根据日志进行构建用户画像,比如你看新闻他那边的相关推荐,或者你看抖音短视频,它里面的相关推荐都是根据用户的行为日志上报,然后根据推荐算法给你下发对应的内容;


好比我们下面的这个抖音短视频最右边的推荐模块,我日常比较喜欢关注汽车之类的信息,所以经常对那些汽车的视频会进行一个点赞收藏。


那这个时候抖音就会知道我这个用户的行为,通过抖音app日志的上报,他那边都可以对应的那个日志服务器收集对应的日志。


然后通过流式处理以及推荐算法,给我打相对应的标签。那后续我刷新视频的时候,它就会给我推荐更多关于汽车相关的,那这样的话我更容易在这个app上面留更多的时间,所以说为什么刷抖音之后停不下来?因为它老是推荐你喜欢的东西,包括你看今日头条也是一样的道理。




例子二:上面的例子是构建一个推荐系统,那除了推荐系统之后,我们还可以用日志去做更多的事情。


一个应用从开发测试上线到一个迭代,在这过程中,我们为了及时的发现线上多一些问题,我们会通过日志采集做一个可视化的平台, 这个可视化平台包括很多监控信息。


比如我们这个站点的访问IP来源集中在哪一个城市?集中在哪个时间段访问?哪个页面访问最频繁?


还有我们这个接口响应状态码, 接口的一个性能, 还有我们接口的秒级访问量,分钟访问量,小时和天访问量。


好比我们对一个系统进行改版之后需要上线。一上线我们在这可视化平台上面发现很多错误的状态码,比如HTTP状态码是500的大量的产生,那我们就可以通过这个就发现我们这个版本的包有问题,应该及时的回滚回去。


说到这里大家应该能明白我们这个日志的一个作用对不对,  那接下来我们就来分析一下nginx的日志我们可以用来做哪些东西。


02

Nginx的access.log日志文件介绍

这一个日志文件, 只要用户访问一次nginx,它就会产生一条记录。它这个默认的配置会记录用户的来源,ip用户的名称以及请求的状态码,还有发送的消息体,还有用户的一个浏览器代理等,下面的就是nginx的默认日志配置文件。


#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';

根据上面的字段,大家可以看出来了做哪些工作了是吧。

  • 统计站点访问ip来源、某个时间段的访问频率

  • 查看访问最频的页面、Http响应状态码、接口性能

  • 接口秒级访问量、分钟访问量、小时和天访问量

  • ...


我们来看一下一个线上真实的访问日志。


122.70.148.18 - - [04/Aug/2020:14:46:48 +0800] "GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1" 200 48 "https://xdclass.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"


上面这个就是一条Nginx的访问日志,我们来详细解释一下每个字段的意思


$remote_addr 对应的是真实日志里的122.70.148.18,即客户端的IP。
$remote_user 对应的是第二个中杠“-”,没有远程用户,所以用“-”填充。
[$time_local]对应的是[04/Aug/2020:14:46:48 +0800]。
“$request”对应的是"GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1"。
$status对应的是200状态码,200表示正常访问。
$body_bytes_sent对应的是48字节,即响应body的大小。
“$http_referer” 对应的是”https://xdclass.net/“,若是直接打开域名浏览的时,referer就会没有值,为”-“。
“$http_user_agent” 对应的是”Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:56.0) Gecko/20100101 Firefox/56.0”。
“$http_x_forwarded_for” 对应的是”-“或者空。

通过上面的详细介绍,相信你已经掌握每个字段的意思, 那我们这边就来准备几个例子,将大家来练习一下这个日志的挖掘。📎access_temp.log


大家可以把上面的这个日志文件下下来,然后传到Linux系统上面去, 那现在我们步骤几个作业,也直接告诉大家答案,悄悄地告诉你们,这也是一个很常见的面试题。


  • 查看访问最频繁的前100个IP

//答案awk '{print $1}' access_temp.log | sort -n |uniq -c | sort -rn | head -n 100
  • 统计访问最多的url 前20名

//答案cat access_temp.log |awk '{print $7}'| sort|uniq -c| sort -rn| head -20 | more


关于awk命令的详细使用,大家可以去看我们Linux的一个专辑, 我这边来简单介绍一下awk和其他几个命令


  • awk 是文本处理工具,默认按照空格切分,$N 是第切割后第N个,从1开始

  • sort命令用于将文本文件内容加以排序,-n 按照数值排,-r 按照倒序来排

  • 案例的sort -n 是按照第一列的数值大小进行排序,从小到大,倒序就是 sort -rn

  • uniq 去除重复出现的行列, -c 在每列旁边显示该行重复出现的次数。


03

自定义日志统计接口性能

除了上面通过awk可以去分析这个默认的nginx访问日志文件。我们也可以自定义我们这个nginx的日志格式,它默认的字段是没有接口的响应耗时。那我们就可以给他增加这样的一个字段,使用 $request_time。


这个$request_time是什么意思呢?很多同学也会和$upstream_response_time搞混,我分别来介绍下。、


从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间
$upstream_response_time:指从Nginx向后端建立连接开始到接受完数据然后关闭连接为止的时间
$request_time一般会比upstream_response_time大,因为用户网络较差,或者传递数据较大时,前者会耗时大很多


那我们现在就来制定一下我们nginx的日志格式,我们在日志模板结尾增加这个字段。


#日志模板log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                     '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for" $request_time';

server {        listen       80;        server_name  aabbccdd.com;
        location / {            root   /usr/local/nginx/html;            index  xdclass.html;        }        #charset koi8-r;        # 采用哪个日志模板        access_log  logs/host.access.log  main; }

通过上面这个配置我,我们重启对应的Nginx服务器。然后你通过刷新对应的接口多请求几次,你就可以发现这个耗时,这一个附件就是我们这边提供好的一个日志文件。📎time_temp.log

大家根据上面的这个日志文件完成我们这一个作业。

  • 统计耗时接口, 列出传输时间超过 2 秒的接口,显示前5条

//答案cat time_temp.log|awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
备注:$NF 表示最后一列, awk '{print $NF}'

本文小结:

  • 掌握常见日志文件的作用。

  • 掌握Nginx访问日志字段的含义。

  • 掌握AWK分析日志文件,还有自定义访问日志的格式。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。