不知道大家有没有过这样的经历,写出来的接口被别人调用,明明自己测试的没有问题,但别人总是出错,并且因为不能正面交谈,很难定位出错的点;或者是统计访问总数时,两边统计的总数会有差的天差地远的时候,每每到这个时候,不管再怎么不愿意,我们总要从别人访问我们接口或者系统的源头开始排查问题,既是 access.log 或者 error.log,因为遇坑太多,本渣渣员在这里记录下自己翻日志的一些过程。
对于查找日志,首先第一要务就是找到 log 文件的位置,这个位置一般写在服务器的配置文件中,以我常用的 nginx 说明,可以用以下命令找到 nginx 的安装目录。
whereis nginx
ps -ef | grep nginx
nginx -t
以上三个命令都是我常用来查找 nginx 安装目录的命令,一般能找到 conf 文件夹,以 .conf 结尾的文件都是 nginx 的配置文件,这个因每个服务器的配置不同而不同,但都是大同小异的,打开配置文件,找到以下的位置就能明确 access.log 的位置了。

之后,就是开启在一堆访问中找到自己要的访问请求的时候了。这时候,千万别傻乎乎的直接用 cat 命令直接打开,一个正常的网站访问有可能十分大,直接打开是会被闪瞎眼的,请谨慎的使用 more 或者 less 命令,当然首推 less ,它跟 more 命令不同的就是它可以向前或者向后浏览文件,而 more 命令只能向前浏览。
当然,我们肯定不能看每一条命令都去确认是不是自己自己需要的访问请求,第一步肯定是根据关键字筛选出自己的所需的访问范围,无疑最常用到的就是 grep 命令了,这个强大的文本搜索工具能够快速的将匹配的行打印出来,而且能够在筛选的结果继续筛选,能让我们将搜索定位到一个比较精确的范围,而且有很多方便的选项,这个大家可自行查询。
下面的命令就是在 access.log 文件中查找包含 aa 字符串的行,并在此基础上查找包含 bb 字符串的行。
grep 'aa' access.log | grep 'bb'
如果日志已经被打包压缩了,也有相似的 zgrep 命令供我们使用,使用的方法是和 grep 一样的。
之后,可能会存在重复访问的情况,为了减少行数,你可以选择去重,直接使用 uniq 命令就可以做到,十分简单便捷,但这里就存在着一个坑。
下面是一条访问请求,大家可以看一下。

从上面的请求我们可以看到,每个访问都是带着时间的,直接对请求的数据去重其实完全没有用,这里你可以选择将主要的访问请求截取出来再做去重,这时候就要祭出 awk 命令了,这是一个文本和数据处理的命令,最大的优势就是十分灵活,这里我小小介绍一下它的基本操作。
以以上的访问请求作例子,我们看出来这是可以用空格作为分隔符截取文本的,以空格截取后,第6段就是我们所需的数据了。
awk -f ' ' '{print $6}'
这样我们就能得到所要的请求了,是不是十分方便。将上面所有命令综合起来使用就是
grep 'aa' access.log | grep 'bb' | awk -f ' ' '{print $6}' | uniq | less
当然如果你还需要统计自己千幸万苦筛选出来的行数,可以直接使用文件命令 wc。
grep 'aa' access.log | grep 'bb' | awk -f ' ' '{print $6}' | uniq | less wc -l
如你所见,linux 下有许多好用的命令,作为一个成长中的程序员,我们也许不能立刻将所有的命令都记住并熟练使用,但我们要结合自己在工作中的需求将命令用起来就到达一定的高度,希望我的小小经历能让大家记住这几个好用的命令。
欢迎关注微信公众号 乱点技能树的小猿
日常发布初出茅庐程序员一些胡言乱语以及编程资源,漫漫编程路,希望我们一起进步!

网友评论