Nginx挖掘access_log互联网公司运维平台案例统计
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分析日志文件,还有自定义访问日志的格式。
- 点赞
- 收藏
- 关注作者
评论(0)