是不是服务器突然变卡,一看磁盘快满了,猜是日志文件太大,却不知道藏在哪个文件夹?对着黑乎乎的命令行,敲了 du 却滚出一堆字,根本找不到最大的那几个?小编前阵子帮朋友的电商服务器处理过,他那 /var/log 目录下的日志堆到 20G,后台都登不进去,后来用 du 命令筛出最大的 10 个,删了旧的立马就好了。今天就把怎么找日志文件位置、用 du 命令查看大小、筛出最大 10 个的步骤,连该删不该删的注意事项,全说明白,新手跟着敲,不用再对着满屏文字发呆。
一、先找准地方:日志文件一般藏在这几个目录,别瞎找
CentOS 7 的日志文件不是乱存的,大部分在固定目录,先记牢这几个地方,省得在整个服务器瞎转悠:
- /var/log:系统日志的 “大本营”,像 messages(系统消息)、secure(登录记录)、nginx/(nginx 日志)、httpd/(apache 日志)都在这。小编处理的服务器,80% 的大日志都在这目录里。
- 自定义目录:比如程序自己建的日志文件夹,像 tomcat 的日志可能在 /usr/local/tomcat/logs,php 的可能在 /var/www/logs。要是你知道程序在哪,就去它的安装目录找找 “logs” 文件夹。
- 用户目录下的日志:少数情况,比如某个脚本的日志会存在 /home/ 用户名 /logs 里,不过这种比较少,先查前两个地方。
朋友之前就犯过傻,在根目录下瞎敲 du,结果翻了半小时,后来才知道日志基本都在 /var/log,白浪费时间。所以啊,先从这几个目录查起,效率高多了。
二、du 命令基础:先看单个目录总大小,心里有个数
找到日志目录后,先别急着筛文件,用 du 命令看看这个目录总共有多大,是不是真的占了大部分磁盘空间:
- 进日志目录:比如查 /var/log,输 “cd /var/log”,回车后就到这个目录下了。
- 看总大小:输 “du -sh .”,“-s” 是只看总和,“-h” 是人性化显示(直接给 G、M 单位),“.” 代表当前目录。比如结果可能是 “15G .”,说明这个目录总共 15G,确实是大日志的锅。
小编提醒,要是显示 “权限不够”,就在命令前加 “sudo”,比如 “sudo du -sh .”,输服务器密码(输的时候屏幕不显示,输完回车),因为 /var/log 里有些文件普通用户看不了。朋友第一次查就没加 sudo,结果显示的大小不对,加上后才看到真实的 15G。
三、筛选最大 10 个日志文件:du+sort+head,3 个命令串起来用
知道目录大了,就得找出里面最大的 10 个文件,这时候得把 du、sort、head 三个命令 “串” 起来用,说白了就是让前一个命令的结果传给后一个处理:
- 先列目录下所有日志文件大小:输 “sudo du -h –max-depth=1”,“–max-depth=1” 意思是只看当前目录下的一级文件和子文件夹,不钻进孙子目录,结果会像 “2.5G ./messages”“5G ./nginx” 这样,每个文件 / 文件夹的大小都列出来。
- 再按大小排序:刚才的结果是乱的,加个 sort 命令排序,输 “sudo du -h –max-depth=1 | sort -rh”,“|” 是管道符,把前面的结果传给 sort;“-r” 是倒序(从大到小),“-h” 是按人性化单位排序(不然会按数字大小乱排,比如 100M 会排在 2G 前面)。这时候最大的文件会跑到最上面。
- 最后只看前 10 个:输 “sudo du -h –max-depth=1 | sort -rh | head -n 10”,“head -n 10” 就是只显示前 10 行,这下屏幕上就只剩最大的 10 个日志文件或文件夹了,一目了然。
小编上次帮朋友筛,结果第一行是 “8G ./nginx/access.log”,明显就是这个文件占了大头。他盯着屏幕说 “原来罪魁祸首在这”,删了旧的日志,磁盘立马空出 8G。
四、自定义目录怎么查?日志不在 /var/log,步骤稍改一下
要是你的日志在自定义目录(比如 /usr/local/tomcat/logs),步骤差不多,就改个目录路径:
- 先 cd 进自定义目录:输 “cd /usr/local/tomcat/logs”(换成你的目录)。
- 再用同样的命令筛选:“sudo du -h –max-depth=1 | sort -rh | head -n 10”,原理一样,就是换了个地方查而已。
有个用户的日志在 /opt/app/logs,他按这步骤查,找出了一个 5G 的 “error.log”,原来是程序报错没处理,日志一直写,才堆这么大。
五、自问自答:新手用 du 筛日志,最容易懵的 3 个问题
问:为什么加了 –max-depth=1?不加会怎样?
答:不加的话,du 会钻进所有子文件夹,比如 /var/log/nginx 下面还有子目录,结果会列出一堆小文件,反而找不到最大的那个总目录。加了这个参数,只看当前目录下的 “一级文件”,清爽多了。
问:筛出来的大文件,能直接删吗?
答:不一定!像 /var/log/messages 这种系统日志,删了可能影响排查问题,最好先备份(比如 “cp messages messages.bak”),或者用 “echo “”> 文件名” 清空内容(比如 “echo”” > access.log”,这样文件还在,内容没了,比删了安全)。程序日志(比如 nginx 的 access.log)只要不影响当前运行,删旧的没问题。
问:命令输错了,提示 “invalid option” 咋办?
答:多半是参数拼错了,比如把 “–max-depth=1” 写成 “-max-depth=1”(少了个减号),或者 “sort -rh” 写成 “sort -hr”(参数顺序错了)。重新输一遍,仔细看清楚符号和字母,新手多敲两次就熟了。
六、小编的实在建议
用 du 命令筛大日志,核心就是 “先定位目录,再组合命令排序,最后筛前 10”。新手别怕命令长,其实就是几个基础命令拼起来,记不住就存在记事本里,用的时候复制粘贴,改改目录就行。
另外,最好定期查一次,比如每周用这个方法看看,别等磁盘满了才着急。还可以设置日志轮转(就是让系统自动切割旧日志,比如每天生成一个新的,旧的压缩存档),CentOS 7 里有 logrotate 工具,设置好能省很多事。小编公司的服务器就设了每周轮转,日志再大也不会堆到占满磁盘。
你要是筛出来最大的文件超过 10G,别直接删,先看看里面写了啥错误,说不定能发现程序的问题,解决了比删日志更彻底。试试这些步骤,保准你能搞定大日志的问题~